[转载]bash下. : () {} [] [[]] (())的解释

http://blog.chinaunix.net/space.php?uid=20715284&do=blog&cuid=2312850

 

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

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


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

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

三、()
() 将多个命令组合在一起执行,相当于一个命令组。

四、{}

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

# A= 123

# ( A= abc; echo $A) ; echo $A
abc
123

#
{ A= abc; echo $A; }; echo $A
abc
abc

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

五、[](test)

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

六、[[]]

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

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

home is a writable directory

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

数字 测试: - eq - ne - lt - le - gt - ge[ [ ] ][ ]一致
文件测试: - r、- l、- w、- x、- f、- d、- s、- nt、- ot,[ [ ] ][ ]一致
字符串测试: > < = (= = ) ! = - n - z,不可使用“< = ”和“> = ”,[ [ ] ][ ]
一致 ,但在[ ] 中,>< 必须使用/进行转义,即/> 和/<
逻辑测试: [ ]- 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


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

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

也能:

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


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

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


注意:使用 (( )) 时,不需要空格分隔各值和运算符,使用[]和[[ ]] 时需要用空格分隔各值和运算符。
来自:http://blog.chinaunix.net/u/25100/showart_466494.html
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值