一.首行要求:shebang机制
二.shell脚本调试
bash -n :只检测脚本中的语法错误,但无法检查出命令错误,不执行脚本
bash -x :调试并执行
常见三种脚本错误:
语法错误:导致后续命令不继续执行,可以用bash -n检查错误,提示出错行数不一定准确
命令错误:默认后续命令还会继续执行,用bash -n无法检查,可以用bash -x进行观察
逻辑错误:只能用bash -x进行观察
三.变量
1.定义
变量表示命名的内存空间,将数据放在内存空间中,通过变量名引用,获取数据
2.变量类型
内置变量:例如PS1,PATH,UID,HOSTNAME,$$,BASHPID,$?,HISTSIZE
用户自定义变量
3.变量数据类型
字符
数值:整型,浮点型,bash不支持浮点数
4.Shell中变量命名法则
①不能使用程序中保留字和内置变量:如if,for
②只能使用数字,字母及下划线,且不能以数字开头(不支持短横线“-”)
③通俗易懂,不用简写
④统一命名规则
⑤变量名大写
⑥局部变量小写
⑦函数名小写
5.变量定义和引用
①赋值: name='value'
value形式:
直接字串 name=‘root’
变量引用 name=‘$USER’
命令引用 name=`COMMAND` 或 name=$(COMMAND)
注:变量赋值临时生效,退出终端后自动删除,脚本中变量随着脚本结束自动删除
②引用: $name 或 ${name}
③显示已定义的所有变量: set
④删除变量: unset <name>
弱引用 "",其中的变量引用会被替换为变量值
强引用'',其中的变量引用不会被替换为变量值,而保持原字符串
6.环境变量
①声明和赋值
声明并赋值 export name=value 或 declare -x name=value
分两步 name=value
export name
②引用
与普通变量一样: $name 或 ${name}
③显示所有环境变量:
env 、 printenv 、 export 、 declare -x
④删除变量
unset name
附:bash内建环境变量
7.只读变量
只能声明定义,但后续不能修改和删除,即常量
①声明:
readonly name 或 declare -r name
②查看:
readonly [-p] 或 declare -r
8.位置变量
在bash shell中内置的变量,在脚本代码中调用通过命令行传递给脚本的参数
清空所有位置变量: set --
9.退出状态码变量
进程执行后,将使用变量$?保存状态码的相关数字,不同值反应成功或失败.取值范围为0-255
$? 的值为0代表成功
$?的值为1到255代表失败
用户可以在脚本中自定义退出状态码: exit [n]
注: 脚本中一旦遇到exit命令,脚本会立即终止;终止退出状态取决于exit命令后面的数字
如果未给脚本指定退出状态码,整个脚本的退出状态码取决于脚本中执行的最后一条命令的状态 码
10.展开命令行
展开命令执行顺序:
变量扩展:
`` :反引号用于命令替换
\ :反斜线,禁止单个字符扩展
! :叹号,命令历史替换
11.脚本安全和set
set命令可以用来定制shell环境,通过修改$-变量来控制shell环境
①$-变量
h :hashall,打开选项后,shell会将命令所在的路径hash下来,避免每次都要查询.通过set +h关闭,set -h开启
i :interactive-comments,交互式shell,脚本中i选项是关闭的
m :monitor,监控模式,可以通过job control来控制进程的停止,继续,后台或者前台执行等
B :braceexpand,大括号扩展
H :history,打开H选项,可以展开历史列表中的命令,用!来完成,如:"!!"返回最近的一个历史命令,"!n"返回第n个历史命令
②脚本安全控制:
-u :在扩展一个没有设置的变量时,显示错误信息,与set -o nounset等同
-e :如果一个命令返回一个非0值(失败)就退出,与set -o errexit等同
-o :option显示,打开或关闭选项
set -o 显示选项
set -o 选项x 打开选项x
set +o 选项x 关闭选项x
-x :当执行命令时,打印命令及其参数,类似bash -x
四.格式化输出printf
常用格式替换符:
%s 字符串
%f 浮点格式
%b 对应参数中包含转义字符时,使用此替换符进行替换,对应转义字符会被转义
%c ASCII字符,显示对应参数的第一个字符
%d,%i 十进制整数
%o 八进制整数
%u 不带正负的十进制值
%x 十六进制a-f
%X 十六进制A-F
%% 表示%本身
注:%#s 这种替换中#代表输出字符宽度,不足补空格,默认友对齐,%-10s 这种替换表示10个字符宽,左对齐(#右对齐补宽,-左对齐补宽)
常用转义字符:
\a 警告
\b 后退
\f 换页
\n 换行
\r 回车
\t 水平制表符
\v 垂直制表符
\ 表示\本身
五.算术运算
shell允许在某些情况下对算术表达式进行求值,如let和declare内置命令,(())复合命令和算术扩展.求值以固定宽度的整数执行,不检查溢出.运算符及优先级,关联性和值与C语言相同
注:bash只支持整数,不支持小数
下列运算符优先级从高至低排列,同组优先级相等
* / %
+ - #加减号
i++ i--
++i --i
= *= /= %= += -= <<= >>= &= ^= |=
- + #正负号
! ~
**
<< >>
<= >= < >
== !=
&
|
^
&&
||
expr?expr:expr
expr1,expr2\
实现算术运算:
随机数生成器变量:
六.逻辑运算
1. 对错: true,false
真为0,假为1
2.与: &
全真为真,有假则假
3.或: |
有真为真,全假则假
4.非: !
!1=0 (真) !0=1 (假)
5.异或: ^
异或的两个值,相同为假,不同为真
6.短路与
7.短路或
七.条件测试命令
判断某需求是否满足,需要由测试机制来实现,专用的测试表达式需要由测试命令辅助完成
表达式执行若真,则状态码变量$?返回0
表达式执行若假,则状态码变量$?返回1
命令格式:
test EXPRESSION
[ EXPRESSION ] #与上表达式等价
[[ EXPRESSION ]]
注意:EXPRESSION前后必须有空白字符
1.变量测试
2.数值测试
还有算术表达式的比较方式:
3.字符串测试
①test和[]用法
②[[]]用法
注:使用正则或通配符时使用[[]],其他情况一般用[]
4.文件测试
①存在性测试
-a file 同 -e,但是有缺陷,最好弃用
-e file 文件存在性测试,存在为真,否则为假
-b file 是否存在且为块设备文件
-c file 是否存在且为字符设备文件
-d file 是否存在且为目录文件
-f file 是否存在且为普通文件
-h file 或 -L file 是否存在且为符号链接文件
-p file 是否存在且为命名管道文件
-s file 是否存在且为套接字文件
②文件权限测试
-r file 是否存在且可读
-w file 是否存在且可写
-x file 是否存在且可执行
-u file 是否存在且拥有suid权限
-g file 是否存在且用户sgid权限
-k file 是否存在且拥有sticky权限
③文件属性测试
-s file 是否存在且非空
-t fd 文件描述符是否在某终端已经打开
-N file 文件自从上一次被读取之后是否被修改过
-O file 当前有效用户是否为文件属主
-G file 当前有效用户是否为文件属组
file1 -ef file2 file1是否是file2的硬链接
file1 -nt file2 file1是否新于file2
file1 -ot file2 file1是否旧于file2
八.关于()和{}
(cmd1;cmd2;...)和{ cmd1;cmd2;...; }都可以将多个命令组合在一起,批量执行
不同: (list)会开启子shell,并且list中变量赋值及内部命令执行后,将不再影响后续的环境
{ list; }不会开启子shell,在当前shell中运行,会影响当前shell环境
*注意大括号中前后的空格*
九.组合测试条件
方式1:
注: -a 和 -o 需要使用测试命令进行,[[]]不支持
方式2:
十.用read命令接受输入
使用read把输入值分配给一个或多个shell变量,read从标准输入中取值,给每个单词分配一个变量,所有剩余单词分配给最后一个变量,如果变量名没有指定,默认标准输入的值赋值给系统内置变量REPLY
read [option] [name...]
-p 指定要显示的提示
-s 静默输入,一般用于密码
-n N 指定输入的字符长度N
-d '字符' 输入结束符
-t N timeout为N秒