美文网首页
shell中&&、||、()、{}以及常规替换的使用方法

shell中&&、||、()、{}以及常规替换的使用方法

作者: 香山上的麻雀 | 来源:发表于2020-01-14 09:27 被阅读0次

    测试题:

    下列命令的结果是多少:

     [ -z "" ] && echo 0 || echo 1
    

    &&运算符:

    command1 && command2

    &&左边的命令(命令1)返回真(即返回0,成功被执行)后,&&右边的命令(命令2)才能够被执行;换句话说,“如果这个命令执行成功&&那么执行这个命令”。
    语法格式如下:

    command1 && command2 [&& command3 ...]
    
    • 命令之间使用 && 连接,实现逻辑与的功能。
    • 只有在 && 左边的命令返回真(命令返回值 $? == 0),&& 右边的命令才会被执行。
    • 只要有一个命令返回假(命令返回值 $? == 1),后面的命令就不会被执行。
    cp ~/Desktop/1.txt ~/1.txt && rm ~/Desktop/1.txt && echo "success"
    

    以上命令首先从 ~/Desktop 目录复制 1.txt 文件到 ~ 目录;执行成功后,使用 rm 删除源文件;如果删除成功则输出提示信息。

    ||运算符:

    command1 || command2

    ||则与&&相反。如果||左边的命令(命令1)未执行成功,那么就执行||右边的命令(命令2);或者换句话说,“如果这个命令执行失败了||那么就执行这个命令。

    • 命令之间使用||连接,实现逻辑或的功能。
    • 只有在 || 左边的命令返回假(命令返回值 $? == 1),||右边的命令才会被执行。这和 c 语言中的逻辑或语法功能相同,即实现短路逻辑或操作。
    • 只要有一个命令返回真(命令返回值 $? == 0),后面的命令就不会被执行。
    rm ~/Desktop/1.txt || echo "fail"
    

    以上命令如果 ~/Desktop 目录下不存在文件 1.txt,将输出提示信息

    rm ~/Desktop/1.txt && echo "success" || echo "fail"
    

    以上命令,如果 ~/Desktop 目录下存在文件 1.txt,将输出 success 提示信息;否则输出 fail 提示信息

    如果希望把几个命令合在一起执行, shell提供了两种方法。既可以在当前shell也可以在子shell中执行一组命令。

    ()运算符:

    它的一般形式为:
    ( 命令;命令;命令… )

    rm ~/Desktop/1.txt || (cd ~/Desktop/;ls -a;echo "fail")
    

    以上,如果目录 ~/Desktop 下不存在文件 1.txt,则执行命令组合。

    {}运算符:

    它的一般形式为:
    { 命令;命令;命令… }
    (注意:在使用{}时,{}与命令之间必须使用一个空格)

    测试:

    A=1;echo $A;{ A=2; };echo $A 
    1 
    2 
     
    A=1;echo $A;( A=2; );echo $A 
    1 
    1 
    

    ()和{}的异同:

    ()和{}都是对一串的命令进行执行,但有所区别:

    相同点:

    ()和{}都是把一串的命令放在括号里面,并且命令之间用;号隔开

    不同点

    ()只是对一串命令重新开一个子shell进行执行,{}对一串命令在当前shell执行
    ()最后一个命令可以不用分号,{}最后一个命令要用分号
    ()里的第一个命令和左边括号不必有空格,{}的第一个命令和左括号之间必须要有一个空格

    几种特殊的替换结构

    ${var:-string},${var:+string},${var:=string},${var:?string}
    
    • ${var:-string} 和 ${var:=string}
      若变量var为空或者未定义,则${var:-string} 和 ${var:=string}命令行输出结果为后边的string,不同的是当var为空或者未定义,使用${var:=string}时候,结果也会输出string,但是同时会把string的值赋给var。
    • 变量var不为空时,则${var:-string} 和 ${var:=string}输出结果是var的值,但是${var:+string}却会输出string的值,如下:
    • ${var:+string}
      例子在上边,即只有当var不是空的时候才输出string,若var为空时则输出空
    • ${var:?string}
      规则:若变量var不为空,则${var:?string}结果为变量var的值
      若变量var为空,则把string输出到标准错误中,并从脚本中退出。
      可利用此特性来检查是否设置了变量的值

    相关文章

      网友评论

          本文标题:shell中&&、||、()、{}以及常规替换的使用方法

          本文链接:https://www.haomeiwen.com/subject/lbyoactx.html