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


    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


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

  • 相关阅读:
    【BZOJ3926】诸神眷顾的幻想乡 【广义后缀自动机】
    【BZOJ2780】Sevenk Love Oimaster【广义后缀自动机】
    【BZOJ3227】串【广义后缀自动机】
    【CodeForces
    【BZOJ3238】差异【后缀自动机+dp】
    【BZOJ4566】找相同字符【后缀自动机】
    【BZOJ3998】弦论 【后缀自动机】
    【poj1743】Musical Theme 【后缀自动机】
    【SPOJ
    【SPOJ
  • 原文地址:https://www.cnblogs.com/tcicy/p/8434282.html
Copyright © 2020-2023  润新知