默认的变量类型是字符串,所以 str1 == str2 ,就是一串字符串;我们想要判断它们是否相等必须使用中括号[ str1 == str2 ]。
1、中括号[ ]
[ ]表示条件测试。注意这里的空格很重要。要注意在'['后面和']'前面都必须要有空格。
常用判断:
[ -d FILE ] 如果 FILE 存在且是一个目录则返回为真。
[ -f FILE ] 如果 FILE 存在且是一个普通文件则返回为真。
字符串判断:
[ -z STRING ] 如果STRING的长度为零则返回为真,即空是真
[ -n STRING ] 如果STRING的长度非零则返回为真,即非空是真
[ STRING1 ] 如果字符串不为空则返回为真,与-n类似
[ STRING1 == STRING2 ] 如果两个字符串相同则返回为真
[ STRING1 != STRING2 ] 如果字符串不相同则返回为真
[ STRING1 < STRING2 ] 如果 “STRING1”字典排序在“STRING2”前面则返回为真。
[ STRING1 > STRING2 ] 如果 “STRING1”字典排序在“STRING2”后面则返回为真。
字典序中的排序是以新华字典的字母排序来进行的
数值判断
[ INT1 -eq INT2 ] INT1和INT2两数相等返回为真 ,=
[ INT1 -ne INT2 ] INT1和INT2两数不等返回为真 ,<>
[ INT1 -gt INT2 ] INT1大于INT2返回为真 ,>
[ INT1 -ge INT2 ] INT1大于等于INT2返回为真,>=
[ INT1 -lt INT2 ] INT1小于INT2返回为真 ,<
[ INT1 -le INT2 ] INT1小于等于INT2返回为真,<=
逻辑判断
[ ! EXPR ] 逻辑非,如果 EXPR 是false则返回为真。
[ EXPR1 -a EXPR2 ] 逻辑与,如果 EXPR1 and EXPR2 全真则返回为真。
[ EXPR1 -o EXPR2 ] 逻辑或,如果 EXPR1 或者 EXPR2 为真则返回为真。
[ ] || [ ] 用OR来合并两个条件
[ ] && [ ] 用AND来合并两个条件
类似python的逻辑短路运算:
使用&& || 来实现
cmd1 && cmd2 如果cmd1执行成功,或者为真,则执行cmd2
cmd1 || cmd2 如果cmd1执行不成功,或者为假,则执行cmd2
cmd1 && cmd2 || cmd3 如果cmd执行成功,就执行cmd2,不成功就执行cmd3
2、双中括号[[ ]]
[[ $hh == d* ]] 查看这个变量是否字符d开头
3、中括号和双中括号的区别
区别一:[[ ]],碰到空白会进行分词
区别二:
[ ]是符合POSIX标准的测试语句,兼容性更强,几乎可以运行在所有的Shell解释器中
[[ ]]仅可运行在特定的几个Shell解释器中(如Bash等)
区别三:<和>在[[ ]]中用作排序,而[ ]不支持
[root@fttswlp menu]# [[ 6 > a ]] # ASCII码中6是小于a的
[root@fttswlp menu]# echo $?
1
[root@fttswlp menu]# [ 6 > a ]
[root@fttswlp menu]# echo $?
0
区别四:[ ]中使用-a和-o表示逻辑与和逻辑或,[[ ]]使用&&和||来表示
[[ ]]不支持-a
[root@fttswlp menu]# [ a == a -a b == b ] && echo Y || echo N
Y
[root@fttswlp menu]# [[ a == a -a b == b ]] && echo Y || echo N
-bash: 条件表达式中有语法错误
-bash: `-a' 附近有语法错误
[root@fttswlp menu]# [[ a == a && b == b ]] && echo Y || echo N
Y
区别五:[ ]支持正则匹配,[[ ]]支持用=~进行正则匹配
[[ ]]判断变量fairy的值是否包含字母c
[root@fttswlp menu]# [ $fairy =~ "c" ] && echo Y || echo N
-bash: [: =~: 期待二元表达式
N
[root@fttswlp menu]# [[ $fairy =~ "c" ]] && echo Y || echo N
Y
区别六:[ ]仅在部分Shell中支持用()进行分组,[[ ]]均支持
区别七:[ ]中如果变量没有定义,那么需用双引号引起来,[[ ]]中不需要
4、小圆括号
- 命令组。括号中的命令将会新开一个子she顺字执行,所以括号中的变量不能够被脚本余下的部分使用。括号中多个命令之间用分号隔开,最后一个命令可以没有分号,各命令和括号之间不必有空格。
- 命令替换。等同于cmd,shell扫描一遍命令行,发现了结构,便将(omd)结构,便将(cmd)中的cmd执行一次,得到其标准输出,再将此输出放到来命令。有些shell不支持,tcsh。
- 用于初始化数组。如: array=(a b c d)
5、双圆括号
- 整数扩展。这种扩展计算是整数型的计算,不支持浮点型。(exp))结构扩展并计算一个算术表达式的值,如果表达式的结果为0,那么返回的退出状态码为1,或者是"假",而一个非零值的表达式所返回的退出状态码将为O,或者是"rue"。若是逻辑判断,表达式exp为真则为1,假则为0。
- 只要括号中的运算符、表达式符合C语言运算规则,都可用在
- 单纯用(())也可重定义变量值,比如a=5; ((a++))可将$a重定义为6
- 常用于算术运算比较,双括号中的变量可以不使用
- 符号前缀。括号内支持多个表达式用逗号分开。只要括号中的表达式符合C语言运算规则,比如可以直接使用for(f=0i<5i++)).如果不使用双括号,则为forinseq04'或者forin0...4。再如可以直接使用if((i<5)),如果不使用双括号,则为if [ $i -t 5 ]
若有问题,还望各位大佬指出