bash中的()、(())、[]、[[]]、{}
总结bash编程中的这些特殊符号
()
单小括号在shell中的两个作用:
- 初始化数组
$(commands)
启动一个新shell执行单个命令或者是多个命令
初始化数组
1 |
|
执行单个命令
1 |
|
执行多个命令
1 |
|
需要注意点:
- 每个命令使用
;
分隔,最后一个命令可以使用;
也可以不用
(())
双小括号仅仅用于整数的处理,只要括号中的运算符、表达式符合C语言运算规则,都可用在$((exp))中,甚至是三目运算符。作不同进位(如二进制、八进制、十六进制)运算时,输出结果全都自动转化成了十进制。如:echo $((16#5f)) 结果为95 (16进位转十进制)
双括号中的变量可以不使用$
符号前缀。括号内支持多个表达式用逗号分开。 只要括号中的表达式符合C语言运算规则,比如可以直接使用for((i=0;i<5;i++))
, 如果不使用双括号, 则为
1 |
|
或者for i in {0..4}
。再如可以直接使用if (($i<5))
, 如果不使用双括号, 则为if [ $i -lt 5 ]
。
[]
bash 的内部命令,[
和test是等同的。此运算符的作用有四个:
- 文件比较
- 整数比较
- 字符串比较
- 逻辑比较
文件比较
整数比较
注意点:
- Test和[]中可用的比较运算符只有
==
和!=
,两者都是用于字符串比较的,不可用于整数比较,整数比较只能使用-eq
,-gt
这种形式。无论是字符串比较还是整数比较都不支持大于号小于号。如果实在想用,对于字符串比较可以使用转义形式,如果比较”ab”和”bc”:[ ab \< bc ]
,但是无法转移>=
<=
。所以最好还是在[]
中使用字母。 - 中间无法使用正则表达式
字符串比较
注意点:
[]
首尾必须有空格
逻辑比较
[ ]中的逻辑与和逻辑或使用-a
和-o
表示。
1 |
|
注意点:
- 上面不要:
[ ($a -e $b) -a ($c -eq $b) ]
会报错 - 注意两边的空格
[[]]
双括号表达式是[]
的扩展,添加了正则表达式的支持。并且不同于[]
的逻辑符号是-a
-o
[[]]
允许使用 &&
||
。如下:
1 |
|
https://taoshu.in/unix/test-bracket.html#fn1
上面这篇文章写了shell中的[
、[[
之间关系
{}
大括号有三个作用:
- 扩展,对于{}内的以逗号分割的文件列表进行拓展。或者对大括号中以点点(..)分割的顺序文件列表起拓展作用。
- 包含多个命令在本shell中执行,
{cd;ls -al;cd -;}
和()
不同的是最后一个命令后必须有;
,而()
不做要求。并且第一条命令和左括号之间必须用空格隔开。 - 函数块
扩展
1 |
|
函数
1 |
|
对于字符串的操作
记忆方法:#
位于$
的右边,所以#
是从右边开始;%
在$
左边,所以是从左边开始
例子
1 |
|
几种特殊的替换结构
1 |
|
${var:-string}
和${var:=string}
:若变量var为空,则用在命令行中用string来替换${var:-string}
,否则变量var不为空时,则用变量var的值来替换${var:-string}
;对于${var:=string}
的替换规则和${var:-string}
是一样的,所不同之处是${var:=string}
若var为空时,用string替换${var:=string}
的同时,把string赋给变量var:${var:=string}
很常用的一种用法是,判断某个变量是否赋值,没有的话则给它赋上一个默认值。${var:+string}
的替换规则和上面的相反,即只有当var不是空的时候才替换成string,若var为空时则不替换或者说是替换成变量 var的值,即空值。(因为变量var此时为空,所以这两种说法是等价的){var:?string}
替换规则为:若变量var不为空,则用变量var的值来替换${var:?string}
;若变量var为空,则把string输出到标准错误中,并从脚本中退出。我们可利用此特性来检查是否设置了变量的值。
补充扩展:在上面这五种替换结构中string不一定是常值的,可用另外一个变量的值或是一种命令的输出。
总结
- 只有
[]
中不可以直接使用数学比较符号如< >
等等,要使用也是要转义的\>
,但是无法转移>=
<=
。所以最好还是在[]
中使用字母。
参考资料
https://www.runoob.com/w3cnote/linux-shell-brackets-features.html
https://www.cnblogs.com/hkui/p/6423918.html
https://math.ecnu.edu.cn/~jypan/Teaching/Linux/Linux08/lect14_Review.pdf