济南优化网站的哪家好,网站设置专栏有什么好处,域名被锁定网站打不开怎么办,怎么在建设厅网站报名目录 Linux之Shell概述
学习shell的原因
shell是什么
shell起源
查看当前系统支持的shell
查看当前系统默认shell
Shell 概念
Shell 程序设计语言
Shell 也是一种脚本语言
用途
Shell脚本的基本元素
基本元素构成#xff1a;
Shell脚本中的注释和风格
Shell脚本编…目录 Linux之Shell概述
学习shell的原因
shell是什么
shell起源
查看当前系统支持的shell
查看当前系统默认shell
Shell 概念
Shell 程序设计语言
Shell 也是一种脚本语言
用途
Shell脚本的基本元素
基本元素构成
Shell脚本中的注释和风格
Shell脚本编写规范
脚本开头 脚本自动增加注释版权信息 案例 --- 创建一个屏保脚本
脚本中尽量不用中文注释
多使用内部命令
没有必要使用cat命令
仔细阅读出错信息
文件名以sh结尾
代码缩进
shell脚本执行
方法1
方法2
方法3
方法4
bash shell基本功能
echo打印命令
格式
参数
可以输出带颜色的字体
printf命令
格式 Linux之Shell概述
学习shell的原因 简单易学 解释性语言不需要编译即可执行 对于一个合格的系统管理员来说学习和掌握Shell编程是非常重要的通过shell程序可以在很大程度上简化日常的维护工作使得管理员从简单的重复劳动中解脱出来
shell是什么
shell起源 1964年美国ATT公司的贝尔实验室、麻省理工学院及美国通用电气公司共同参与开始研发一套可以安装在大型主机上的多用户、多任务的操作系统该操作系统的名称为Multics 1970年丹尼斯•里奇和汤普逊启动了另外一个新的多用户、多任务的操作系统的项目他们把这个项目称之为UNICS 1973年使用C语言重写编写了Unix。通过这次编写使得Unix得以移植到其他的小型机上面 1979年第一个重要的标准UNIX Shell在Unix的第7版中推出并以作者史蒂夫•伯恩StephenBourne的名字命名叫做Bourne Shell简称为sh 20世纪70年代末C Shell作为2BSD UNIX的一部分发布简称csh。之后又出现了许多其他的Shell程序主要包括Tenex C Shelltcsh、Korn Shellksh以及GNU Bourne-Again shellbash 查看当前系统支持的shell
[rootlocalhost ~]# cat /etc/shells 查看当前系统默认shell
[rootlocalhost ~]# echo $SHELL Shell 概念 Shell外壳--- 是一种命令解释器程序他能识别用户输入的各种命令并传递给操作系统
结构图 真正能够控制计算机硬件CPU、内存、显示器等的只有操作系统内核Kernel图形界面和命令行只是架设在用户和内核之间的一座桥梁由于安全、复杂、繁琐等原因用户不能直接接触内核也没有必要需要另外再开发一个程序让用户直接使用这个程序该程序的作用就是接收用户的操作点击图标、输入命令并进行简单的处理然后再传递给内核这样用户就能间接地使用操作系统内核 用户界面和命令行就是这个另外开发的程序就是这层“代理”。在Linux下这个命令行程序叫做 ShellShell 是一个应用程序它连接了用户和 Linux 内核让用户能够更加高效、安全、低成本地使用 Linux 内核这就是 Shell 的本质。 Shell 本身并不是内核的一部分它只是站在内核的基础上编写的一个应用程序它和 QQ、迅雷、Firefox 等其它软件没有什么区别。然而 Shell 也有着它的特殊性就是开机立马启动并呈现在用户面前用户通过 Shell 来使用 Linux不启动 Shell 的话用户就没办法使用 Linux。
Shell 程序设计语言
Shell 也是一种脚本语言 任何代码最终都要被“翻译”成二进制的形式才能在计算机中执行 有的编程语言如 C/C、Pascal、Go语言、汇编等必须在程序运行之前将所有代码都翻译成二进制形式也就是生成可执行文件用户拿到的是最终生成的可执行文件看不到源码。这个过程叫做编译Compile这样的编程语言叫做编译型语言完成编译过程的软件叫做编译器Compiler 有的编程语言如 Shell、JavaScript、Python、PHP等需要一边执行一边翻译不会生成任何可执行文件用户必须拿到源码才能运行程序。程序运行后会即时翻译翻译完一部分执行一部分不用等到所有代码都翻译完。这个过程叫做解释这样的编程语言叫做解释型语言或者脚本语言Script完成解释过程的软件叫做解释器 编译型语言的优点 --- 执行速度快、对硬件要求低、保密性好适合开发操作系统、大型应用程序、数据库等 脚本语言的优点 --- 使用灵活、部署容易、跨平台性好非常适合 Web 开发以及小工具的制作 Shell 就是一种脚本语言我们编写完源码后不用编译直接运行源码即可
用途 shell脚本的优势在于处理操作系统底层的业务 linux系统内部的应用都是shell脚本完成因为有大量的linux系统命令为它做支撑。2000多个命令都是shell脚本编程的有力支撑特别是grep、awk、sed等。例如一键软件安装、优化、监控报警脚本常规的业务应用shell开发更简单快速符合运维的简单、易用、高效原则 PHP、Python优势在于开发运维工具以及web界面的管理工具web业务的开发等。处理一键软件安装、优化报警脚本。常规业务的应用等php/python也是能够做到的。但是开发效率和复杂比用shell就差很多了 熟练掌握shell编程基础知识 熟练使用vivim编辑器 熟练掌握Linux基本命令 熟练掌握文本三剑客工具grep、sed、awk 熟悉常用服务器部署、优化、日志及排错 建议 掌握Shell脚本基本语法 形成自己的脚本开发风格 从简单做起简单判断简单循环 多模仿多参考资料练习多思考 学会分析问题逐渐形成编程思维 编程变量名字要规范采用驼峰语法表示 不要拿来主义特别是新手 Shell脚本的基本元素
基本元素构成 第1行的“#!/bin/bash” 注释 --- 说明某些代码功能 可执行语句 --- 实现程序的功能
Shell脚本中的注释和风格 作用 --- 通过在代码中增加注释可以提高程序的可读性 传统的Shell只支持单行注释其表示方法是一个井号“#”从该符号开始一直到行尾都属于注释的内容
#comment1
#comment2
#comment3
... 多行注释 --- 使用冒号“:”配合here document 语法如下
:xxxx
comment1
comment2
comment3
……
xxxx xxxx 可以是字符或数字单引号可以不加但以防出现莫名其妙的意外发生比如发生字符扩展命令替换 Shell脚本编写规范
脚本开头 开头制定脚本解释器 --- #!/bin/sh 或 #!/bin/bash 其他行#表示注释 程序开头需要加版本版权等信息如
# Date:创建日期
# Author:作者
# Mail:联系方式
# Function:功能
# Version:版本 脚本自动增加注释版权信息
[rootlocalhost ~]# vim ~/.vimrc
autocmd BufNewFile *.py,*.cc,*.sh,*.java exec :call SetTitle()func SetTitle()if expand(%:e) shcall setline(1,#!/bin/bash)call setline(2,##############################################################)call setline(3, # File Name: .expand(%))call setline(4, # Version: V1.0)call setline(5, # Author: Andy_Sun)call setline(6, # Email: Andy_Sun163.com)call setline(7, # Organization: http://www.cnblogs.com/Andy_Sun/)call setline(8, # Created Time : .strftime(%F %T))call setline(9, # Description:)call setline(10,##############################################################)call setline(11, )endif
endfunc 案例 --- 创建一个屏保脚本
[rootlocalhost ~]# vim cmatrix.sh
wget http://archive.ubuntu.com/ubuntu/pool/universe/c/cmatrix/cmatrix_1.2a.orig.tar.gztar xvf cmatrix_1.2a.orig.tar.gzcd cmatrix-1.2ayum install -y ncurses-develyum install -y gcc./configure make make installecho Program installation complete !
echo Program installation complete !
echo Program installation complete ![rootlocalhost ~]# bash cmatrix.sh [rootlocalhost ~]# cmatrix 脚本中尽量不用中文注释 别吝啬添加注释必要的注释方便自己别人理解脚本逻辑和功能 尽量用英文注释防止本机或切换系统环境后中文乱码的困扰 单行注释可以放在代码行的尾部或代码行的上部 多行注释用于注解复杂的功能说明可以放在程序体中也可以放在代码块的开始部分代码修改时对修改的内容
多使用内部命令 无论碰到哪种情况请尽量考虑使用内部命令而不是外部命令 内部命令执行的效率高性能好
没有必要使用cat命令 这是我们经常在论坛里讨论的话题之一。没有必要使用cat命令指的是在有些时候我们会发现根本没有必要使用cat命令。使用了多余的cat命令会让你的代码看起来很丑陋而且还会带来性能上的问题 例如 --- 以下两条命令的结果一样
[rootlocalhost ~]# cat /etc/passwd | grep root[rootlocalhost ~]# grep root /etc/passwd
仔细阅读出错信息 程序员常犯的一个错误是 --- 当我们敲入的命令报错后我们中的大多数人只是对错误信息一瞥而过而不会去认真的读一读很多时候错误信息里就包含了解决办法 有时候我们修改了某个错误并再次运行后系统依旧会报错。然后我们再次修改但系统再次报错。这可能会持续很长时间。但实际上旧的错误可能已经被纠正只是由于出现了其它一些新错误才导致系统再次报错。而我们依旧在怀疑为什么修改好的代码依然不能正常运行
文件名以sh结尾 shell脚本文件名应见名知义 扩展名位sh如backup_mysql.sh
代码缩进 shell没有强制要求但建议缩进这样可以提高阅读性程序更有层次感
[rootlocalhost ~]# vim 99.sh
#!/bin/bash
for((i1;i10;i))
doecho -ne $i\t
doneechofor((i1;i70;i))
doecho -n
doneechofor((i1;i10;i))
dofor((j1;ji;j))doecho -en $i*$j$[i*j]\tdoneecho
done
[rootlocalhost ~]# bash 99.sh shell脚本执行
方法1 使用sh或bash命令执行脚本不需要执行权限建议使用脚本中可以不指定解释器
[rootlocalhost ~]# vim test.sh
#!/bin/bash
echo china
[rootlocalhost ~]# bash test.sh
[rootlocalhost ~]# sh test.sh 可以使用bash -n 脚本名 进行语法检测且不执行脚本 可以使用bash -x 脚本名 进行脚本执行跟踪逐条语句的跟踪执行 方法2 切换到脚本所在目录使用./执行脚本需要执行权限
[rootlocalhost ~]# ./test.sh
-bash: ./test.sh: Permission denied #权限不够[rootlocalhost ~]# chmod x test.sh
[rootlocalhost ~]# ./test.sh 方法3 绝对路径执行脚本需要执行权限
[rootlocalhost ~]# vim /t1.sh
#!/bin/bash
echo china[rootlocalhost ~]# /t1.sh
-bash: /t1.sh: Permission denied #权限不够[rootlocalhost ~]# chmod x /t1.sh
[rootlocalhost ~]# /t1.sh 方法4 使用点.或者source 执行脚本不需要执行权限
[rootlocalhost ~]# source /t1.sh [rootlocalhost ~]# . test.sh 注意 方法1、2、3都是启动一个子shell在子shell中执行此脚本脚本中设置的变量在脚本执行完毕后不会保存 法4 则都是在当前shell进程中执行此脚本而不是重新启动一个shell 在子shell进程中执行此脚本并且脚本中设置的变量在脚本执行完毕后会保存下来 bash shell基本功能
echo打印命令
格式 echo -参数 内容
参数 参数作用-n 取消输出后行末的换行符 -e启用转义字符
可以输出带颜色的字体 格式 --- echo -e \e[字体控制字体颜色或背景色 字符串内容\e[0m \e[表示控制开始\e[0m表示控制结束 字体控制选项 --- 1表示高亮4表示下划线5颜色闪烁 颜色如下字颜色30-37背景色40-47 [rootlocalhost ~]# vim color.sh
#!/bin/bash
echo -e \e[30m 黑色字 \e[0m]
echo -e \e[1;31m 红色字 \e[0m
echo -e \e[32m 綠色字\e[0m
echo -e \e[33m 黃色字\e[0m
echo -e \e[34m 藍色字\e[0m
echo -e \e[35m 紫色字\e[0m
echo -e \e[36m 天藍字\e[0m
echo -e \e[37m 白色字\e[0m
echo -e \e[40;37m 黑底白字\e[0m
echo -e \e[41;37m 紅底白字\e[0m
echo -e \e[42;37m 綠底白字\e[0m
echo -e \e[43;37m 黃底白字\e[0m
echo -e \e[44;37m 藍底白字\e[0m
echo -e \e[45;37m 紫底白字\e[0m
echo -e \e[46;37m 天藍底白字\e[0m
echo -e \e[47;30m 白底黑字\e[0m[rootlocalhost ~]# bash color.sh printf命令 printf 命令模仿 C 程序库library里的 printf() 程序 由 POSIX 标准所定义因此使用 printf 的脚本比使用 echo 移植性好printf 使用引用文本或空格分隔的参数外面可以在 printf 中使用格式化字符串还可以制定字符串的宽度、左右对齐方式等。默认 printf 不会像 echo 自动添加换行符我们可以手动添加 \n
格式 printf 格式控制字符串 参数列表
[rootlocalhost ~]# echo Hello, shell
[rootlocalhost ~]# printf Hello, shell\n[rootlocalhost ~]# printf Hello, shell [rootlocalhost ~]# printf %d %s \n 1 abc[rootlocalhost ~]# printf %d %s \n 1 abc # 单引号双引号效果一样 [rootlocalhost ~]# printf %-10s %-8s %-4s\n 姓名 性别 体重kg %s %c %d %f 都是格式替代符s 输出一个字符串d 整型输出c 输出一个字符f 输出实数以小数形式输出。 %-10s 指一个宽度为 10 个字符- 表示左对齐没有则表示右对齐任何字符都会被显示在 10 个字符宽的字符内如果不足则自动以空格填充超过也会将内容全部显示出来 [rootlocalhost ~]# printf %-10s %-8s %-4s\n 姓名 性别 体重kg
[rootlocalhost ~]# printf %-10s %-8s %-4.2f\n 郭靖 男 66.1234%-4.2f 指格式化为小数其中 .2 指保留2位小数