linux之${ }、[ ]、$( )、$[ ]、$(( ))、[[ ]]、(( ))的作用
1. ${}和{}
\(与\){ }都是用来引用变量的,只不过${ }可以指定变量边界,也可用于对字符串变量进行截取等处理,
2. []和test
[ ]是test命令的另一种形式,用于判断某个表达式的返回值是0或者非0,常用于if命令的判断条件
test $a == "linux" 等于 [ $a == "linux" ]
注意
[后和]前都需要有空格,并且==两边也都要有空格
3. $() 和 ``
$()和``的作用一致,都是用来做命令替换用,一般用于将命令返回的结果传递给变量
a=$(ls /home/hadoop101/)
a=`ls /home/hadoop101/\`
a保存的是上述命令的返回值,即一个目录列表
4. $[]和(())
\([]和\)(())的作用一样,都是进行数学运算的,支持±*/%,并且在\([ ]和\)(( ))中使用变量不需要$引用,可以直接使用变量名
echo $[2+7]
9
a=3;b=4;echo $[$a+$b]
7
echo $((2+7))
9
a=3;b=4;echo $(($a+$b))
7
a=3;b=4;echo $((a+b))
7
5. [] [[]]的区别
多数情况下[]和[[]]是可以通用的,两者的主要差异是:test或[]是符合POSIX标准的测试语句,兼容性更强,几乎可以运行在所有Shell解释器中,相比较而言[[]]仅可运行在特定的几个Shell解释器中(如Bash、Zsh等)。
然而,目前支持使用[[]]进行条件测试的解释器已经足够多了。使用[[]]进行测试判断时甚至可以使用正则表达式。
主要差别:
- 虽然
[]也支持同时进行多个条件的逻辑测试,但是在[]中需要使用-a和-o进行逻辑与和逻辑或的比较操作,而[[]]中可以直接使用&&和||进行逻辑比较操作,更直观,可读性更好。
比如:
[[ A && B ]]或者[ A -a B ],意思是仅当A和B两个条件测试都成功时,整体测试结果才为真。
[[ A || B ]]或者[ A -o B ],意思是只要A或B中的任意一个条件测试成功,则整体测试结果为真。
[root@centos7~]# [ yes == yes -a no == no ] && echo Y || echo N
Y
[root@centos7~]# [ yes == y -a no == no ] && echo Y || echo N
N
[root@centos7~]# [ yes == y -o no == no ] && echo Y || echo N
Y
[root@centos7~]# [ yes == yes -o no == no ] && echo Y || echo N
Y
[root@centos7~]# [[ yes == yes && no == no ]] && echo Y || echo N
Y
[root@centos7~]# [[ yes == y && no == no ]] && echo Y || echo N
N
[root@centos7~]# [[ yes == yes || no == no ]] && echo Y || echo N
Y
[root@centos7~]# [[ yes == y || no == no ]] && echo Y || echo N
Y
[root@centos7~]# [[ A == A && 6 -eq 6 && C == C ]]
[root@centos7~]# echo $? #返回0表示正确0
[root@centos7~]# [[ A == A && 6 -eq 3 && C == C ]]
[root@centos7~]# echo $? #返回非0表示错误1
- 需要注意的还有
==比较符,在[[]]中==是模式匹配,模式匹配允许使用通配符。例如,Bash常用的通配符有*、?、[…]等。而==在test语句中仅代表字符串的精确比较,判断字符串是否一模一样
[root@centos7~]# name=Xiao
[root@centos7~]# [[ $name == X* ]] && echo Y || echo N
Y
[root@centos7~]# [[ a == [a-z] ]] && echo Y || echo N
Y
[root@centos7~]# [ $name == X? ] && echo Y || echo N
N
[root@centos7~]# [ $name == X* ] && echo Y || echo N
N
[root@centos7~]# name='X*'
[root@centos7~]# [ $name == 'X*' ] && echo Y || echo N
Y
[root@centos7~]# [[ a == a ]] && echo Y || echo N
Y
[root@centos7~]# [ a == b ] && echo Y || echo N
N
- 在
[[]]中还支持使用=~进行正则匹配,而在[]中则完全不支持正则匹配
[root@centos7~]# name="welcome to beijing"
[root@centos7~]# [[ $name =~ w ]] && echo Y || echo N
Y
[root@centos7~]# [[ $name =~ [a-z] ]] && echo Y || echo N
Y
总结
[[]]测试 |
[]测试 |
|---|---|
<排序比较 |
不支持 |
&& 逻辑与 |
-a 逻辑与 |
||逻辑或 |
-o 逻辑或 |
==模式匹配 |
==字符匹配 |
=~正则匹配 |
不支持 |
()分组测试 |
仅部分shell支持 |
6. (())
(( ))的主要用法大概有三个:
- 与\(结合使用进行数学运算\)(( ))
- 在for循环命令中控制循环,类似于c语言
- 改变变量的值,且不需要$引用
for((i=1;i<10;i++))
do
echo "this is $i"
done
i=0
while [ $i -le 10 ]
do
echo "this is $i"
((i++))
done
或者
i=0
while [ $i -le 10 ]
do
echo "this is $i"
((i=i+1))
done
reference
shell中28个特殊字符 见Linkedin
shell 中各种括号的作用()、(())、[]、[[]]、{} 见Linkedin
Linux—shell中$(())、$()与${}的区别 见Linkedin
浙公网安备 33010602011771号