(){}(())[][[]]
单小括号 ()
():等同`` ,命令组。括号中的命令将会新开一个子 shell 顺序执行,所以括号中的变量不能够被脚本余下的部分使用。括号中多个命令之间用分号隔开,最后一个命令可以没有分号,各命令和括号之间不必有空格。
可以使用$获取()中的标准输出,$()
array=(a b c d) 用于初始化数组
{}
{}和()一样可以将多个命令组合在一起,使用分号隔开,批量执行,区别在于:
1.()是新开进程,{}在当前进程
2.()和命令之间不需要空格,{}左边和命令之间必须要有空格
3.()中最后一个命令可以不加分号,{}中所有命令都要加分号 4.$搭配()可以获取()的返回值;$搭配{}是用来解析变量,这点和 php 一样
扩展
bash 支持{a,b,c}这样的扩展,比如 a{d,c,b}e 会被扩展成 ade ace abe
类似还有:cp filename{,bak}
等同于 :cp filename filename.bak
简化重复字符串
{} 可以实现打印重复字符串的简化形式
1 | [root@4710419222 test]# touch {0..9}.log |
补充:批量创建文件是用{},批量显示文件使用[]
变量替换
变量测试
双小括号 (())
将数学运算表达式放在(())中,表达式可以有一个,也可以由多个,多个表达式用逗号分割,(())的执行结果取决于最后一个表达式的值
可以使用$获取(())命令的执行结果
单中括号 []
[]有两种用法:一是等同 test; 二是算数运算$[],等同于$(())
关于 test 和[],推荐使用[]; 关于$[]和$(()),推荐使用$(())
1. 等同 test
等同于 test 命令,通常和 if 语句一起使用,在”[]”的内部和数据之间必须使用空格;否则判断式会报错。
test 和[]中可用的比较运算符只有==和!=,两者都是用来比较字符串的,不可用于整数比较,整数比较只能使用-eq、-gt 这种形式。
具体参数参考test.md
双中括号 [[]]
[[]]是shell内置关键字,它和test类似,也用来检测某个条件是否成立。
test能做到的,[[]]也能做到,而且做的更好,test 做不到的,[[]]还能做到。可以认为[[]]是 test 的升级版,对细节进行了优化,并扩展了一些功能。
[[]]的用法
1 | [[ expression ]] |
当[[]]判断expression成立时,退出状态0,否则为非0值,注意[[]]和 expression 之间的空格,这两个空格是必须的,否则会导致语法错误。
[[]]不需要注意某些细枝末节
[[]]是shell内置关键字,不是命令,在使用时没有给函数传递参数的过程,所以test命令的某些注意事项在[[]]中不存在了,具体包括:
- 不需要把变量名用””包裹起来,即使变量是空值,也不会出错
- 不需要、也不能对>、<进行转义,转义后会出错
[[]]支持逻辑运算符
[[]]剔除了 test 命令的-o 和-a 选项,只能使用||和&&
[[]]支持正则表达式
在[[]]中,可以使用=~来检测字符串是否符合某个正则表达式,他的用法为:
1 | [[ str =~ regex ]] |
总结
[[]]完全可以替换[],但是[[]]对数字的比较仍然不友好,所有,当 if 判断条件时,用(())来处理整型数字,当使用正则表达式或通配符使用[[]],其它情况一般使用 [ ]