zoukankan      html  css  js  c++  java
  • bash下. : () {} [] [[]] (())的解释 (非原创,侵删)

    Copy from http://blog.chinaunix.net/uid-20380484-id-1692999.html

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

    一、.(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


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

  • 相关阅读:
    I NEED A OFFER!
    水题 Codeforces Round #303 (Div. 2) A. Toy Cars
    模拟 HDOJ 5099 Comparison of Android versions
    模拟 HDOJ 5095 Linearization of the kernel functions in SVM
    贪心 HDOJ 5090 Game with Pearls
    Kruskal HDOJ 1863 畅通工程
    Kruskal HDOJ 1233 还是畅通工程
    并查集 HDOJ 1232 畅通工程
    DFS/并查集 Codeforces Round #286 (Div. 2) B
    水题 Codeforces Round #286 (Div. 2) A Mr. Kitayuta's Gift
  • 原文地址:https://www.cnblogs.com/codingforum/p/5730089.html
Copyright © 2011-2022 走看看