1、!
逻辑 "非"操作符
反转命令或条件测试的结果, 并且这会影响退出状态码.
! echo "a" #!后面需要空格, $?则为1
bash历史命令机制
!<历史命令头几个字符> #则打印命令,执行命令,注意无空格,且此机制在脚本执行中被禁用
2、广泛的if
"if COMMAND"结构将会返回COMMAND的退出状态码
#比较文件
if cmp a b &> /dev/null # 禁止输出.
then echo "Files a and b are identical."
else echo "Files a and b differ."
fi
#非常有用的"if-grep"结构:
if grep -q Bash file
then echo "File contains at least one occurrence of Bash."
fi
#if测试条件可以嵌套
if echo "Next *if* is part of the comparison for the first *if*."
if [[ $comparison = "integer" ]] #上一行if的复杂测试条件
then (( a < b )) #数字比较
else [[ $a < $b ]] #字符串字符序比较
fi
then
echo '$a is less than $b'
fi
#if [ ] 测试
if [ xyz ] # 字符串、任意数字均为真,未声明变量为假,注意要有空格,否则报错
3、test [ ] [[ ]] (( ))
if test -z "$1" == if [ -z "$1" ]
使用[[ ... ]]条件判断结构, 而不是[ ... ], 能够防止脚本中的许多逻辑错误. 比如, &&, ||, <, 和> 操作符能够正常存在于[[ ]]条件判断结构中, 但是如果出现在[ ]结构中的话, 会报错
[]条件判断也不一定非得要if不可, 也可以使用列表结构. e.g. [ "$var1" -ne "$var2" ] && echo "$var1 is not equal to $var2"
(( )): 扩展并计算一个算术(整数)表达式的值. 如果表达式的结果为0, 那么返回的退出状态码为1, 或者是"false". 而一个非零值的表达式所返回的退出状态码将为0, 或者是"true".
4、文件测试符
-e : 文件存在
-f : 存在且不为目录和设备文件
-d : 目录存在
-s : 文件大小不为零
-r -w -x : 文件是否具有可读、写、执行权限
f1 -nt f2 : 文件f1比文件f2新
f1 -ot f2 : 文件 f1比文件 f2旧
5、字符串测试符
[ $a == z* ] # 如果$a以"z"开头(模式匹配)那么结果将为真
[ "$a" == "z*" ] # 如果$a与z*相等(就是字面意思完全一样), 那么结果为真.
<小于,依照ASCII字符排列顺序 > 与此相同
if [[ "$a" < "$b" ]]
if [ "$a" \< "$b" ] #注意"<"字符在[ ] 结构里需要转义
-z : 字符串为"null",即是指字符串长度为零。 -n : 字符串不为"null",即长度不为零.
6、算术操作符
** 求幂
let “a=5**3”
expr 5%3
7、数字表示
8进制: 以 0 开头
16进制: 以'0x'或者'0X'开头的数字
其他进制: BASE#NUMBER, BASE的范围在2到64之间,NUMBER受限于ASCII字符范围(2 - 64):10个数字 + 26个小写字母 + 26个大写字符 + @ + _
e.g. let "b64 = 64#@_" # 4031