bash 中 () {} [] [[]] (()) 的解释

bash 中 () {} [] [[]] (()) 的解释

来源  https://www.cnblogs.com/fhefh/archive/2011/04/16/2017895.htmlhtml

 

bash下有不少像{}、[]等一些符号命令,下面是我对一些经常使用的符号命令的学习笔记,如有错误或纰漏望各位兄弟指正。

1、.(source)
.(点)与source命令同样,从文件中读取并执行命令,不管该文件是否都有可执行权限都可以正确的执行。且是在当前shell下执行,而不是产生一个子shell来执行(咱们一般使用“./filename.sh”去执行一个文件是在当前shell下产生一个子shell去执行的)。因此在设置bash的环境的变量时,就必须用该命令或者source命令去执行设置的环境变量才会对当前shell生效,以下:

shell

for i in /etc/profile.d/*.sh ; do
    if [ -r "$i" ]; then
        . $i
    fi
done
bash


2、:
: 该命令什么都不作,但执行后会返回一个正确的退出代码,即exit 0。好比在if语句中,then后面不想作任何操做,可是又不能空着,这时就可使用“:”来解决,以下:

学习

if [ "$i" -ne 1 ];then
    :
else
    echo "$i is not equal 1"
fi
测试


3、()
() 将多个命令组合在一块儿执行,至关于一个命令组。

4、{}
{}  和()相似,也是将多个命令组合在一块儿。它们之间的区别是,()是在产生的子shell下执行,而{}是在当前的shell下执行。这与前面讲到是使用".  filename.sh"和"./filename.sh"的区别同样。举一个很简单的例子:
 spa

# A=123
 
(A=abc;echo $A);echo $A
abc
123
# { A=abc;echo $A; };echo $A
abc
abc
code


从上面的示例能够看出,当在()中赋值的变量,影响的只是自身的子shell,而不能将该值赋给父shell,由于“父亲不能继承儿子”。而在{}中赋值的变量,由于就在当前的shell执行的,因此就能改变原来变量的值。
注意:()里面两边能够不使用空格,{}里面两边必须使用空格,且最后一个命令也须要以“;”结尾,表示命令结束。

5、[](test)
[] 与test命令同样,用于比较值以及检查文件类型。以下:
一、[ "$A" = 123 ]:是字符串的测试,以测试 $A 是否为 一、二、3 这三个连续的"文字"。
二、[ "$A" -eq 123 ]:是整数的测试,以测试 $A 是否等于"一百二十三"。
三、[ -e "$A" ]:是关于文件的测试,以测试 123 这份"文件"是否存在。

6、[[]]
[[]]能够说是[]的“加强版”,它可以将多个test命令支持的测试组合起来,例如:

htm

# [[ (-d "$HOME") && (-w "$HOME") ]] && echo echo "home is a writable directory"  
blog

home is a writable directory
继承


至于这二者的区别有位仁兄已经写的很清楚了,我将其整理一下:

数字测试: -eq -ne -lt -le -gt -ge,[[ ]]同 [ ]一致
文件测试: -r、-l、-w、-x、-f、-d、-s、-nt、-ot,[[ ]]同 [ ]一致
字符串测试: > < =(同==) != -n -z,不可以使用“<=”和“>=”,[[ ]]同 [ ]
<

SPAN style="COLOR: rgb(0,1,2)">一致,但在[]中,>和<必须使用\进行转义,即\>和\<
逻辑测试: []为 -a -o ! [[ ]] 为&& || !
数学运算: [] 不可使用 [[ ]]可使用+ - */ %
组合: 都可用各自逻辑符号链接的数字(运算)测试、文件测试、字符测试


拿这二者对字符串的测试举一个例子,以下:

# [ a \> 1 ] && echo ture || echo false
ture
# [[ a > 1 ]] && echo ture || echo false
ture


字符串的比较是根据相应的ASCII码来比较的,因此a>1是成立的。若是有兴趣也能够思考一下为何会出现下面的结果?

# [[ a > 1 ]] && echo ture || echo false
ture


7、(())
(())专门来作数值运算,若是表达式求值为 0,则设置退出状态为 1;若是求值为非 0 值,则设置为 0。不须要对 (( 和 )) 之间的操做符转义。算术只对整数进行。除 0 会产生错误,但不会产生溢出。能够执行 C 语言中常见的算术、逻辑和位操做。以下:

# ((i=1+99));echo $i
100


也能:

# i=99;((i++));echo $i
100


除此以外,也可使用$(())直接进行数值运算,以下:

# echo $((2**3))
8


注意:使用 (( )) 时,不须要空格分隔各值和运算符,使用[]和[[ ]] 时须要用空格分隔各值和运算符。 
  

===================== End

相关文章
相关标签/搜索