• shell中各种括号的作用()、(())、[]、[[]]、{}


    目录

    单括号()

    双括号(( ))

    单中括号[ ]

    双中括号[[]]

    大括号{}

    符号$后的括号

    多条命令执行

    算数运算:双小括号 (( ))
    整数比较:中括号 [ ] ——左右留空格
    字符串比较:双中括号 [[ ]]
    快速替换:花括号 { } ——左右留空格
    反单引号:用sub shell执行命令 ` `
    shell命令及输出:小括号 ( )

    单括号()
    另开命令组
    开启一个sub shell独立运行;
    括号中以分号连接,最后一个命令不需要;
    各命令和括号无空格
    得到命令输出
    a=$(command), 等同于a=`command`, 得到命令输出传递给变量a
    初始化数组 array=(a b c d)
     

    双括号(( ))
    省去$符号的算术运算
    例如

    for((i=0;i<5;i++));    # 括号内支持多表达式用逗号分开
    if (($i<5));
    a=5; ((a++))    # a++

    C语言规则运算 $((exp))

    exp为符合C语言规则的运算符,表达式

     跨进制运算

    二进制、八进制、十六进制运算时,输出结果全都自动转化成十进制。
    如:echo $((16#5f))结果为95 (16进位转十进制)
     
    单中括号[ ]
    字符串比较
    ==和!=

    整数比较

    -ne : 不等于;

    -gt :大于;

    -lt :小于;

    -eq:等于;

    数组索引
    array[0]

    双中括号[[]]
    字符串比较
    可以把右边的作为一个模式,而不仅仅是一个字符串,比如[[ hello == hell? ]],结果为真。[[ ]] 中匹配字符串或通配符,不需要引号。
     

    逻辑运算符
    防止脚本许多逻辑错误,比如&& , || , < , > 操作符能够正常存在于[[ ]]条件判断结构中,但是如果出现在[ ]结构中的话,会报错。
    比如可以直接使用if [[ $a != 1 && $a != 2 ]],
    如果不适用双括号, 则为if [ $a -ne 1] && [ $a != 2 ] 或者 if [ $a -ne 1 -a $a != 2 ]
     

    退出码
    bash把双中括号中的表达式看作一个单独的元素,并返回一个退出状态码。

    if ($i<5) 
    if [ $i -lt 5 ] 
    if [ $a -ne 1 -a $a != 2 ] 
    if [ $a -ne 1] && [ $a != 2 ] 
    if [[ $a != 1 && $a != 2 ]] 
    
    for i in $(seq 0 4)
    do echo $i; done 
    
    for i in `seq 0 4`
    do echo $i; done 
    
    for ((i=0;i<5;i++))
    do echo $i; done 
    
    for i in {0..4}
    do echo $i; done 

    大括号{}

    创建匿名函数
    不会新开进程,括号内变量余下仍可使用。

    括号内的命令间用分号隔开,最后一个也必须有分号。

    {}的第一个命令和左括号之间必须要有一个空格。

     特殊替换

    ${var:-string},${var:+string},${var:=string},${var:?string}

     ①${var:-string}和${var:=string}:

    若变量var为空,则用string来替换${var:-string},否则var不为空,则用var的值来替换${var:-string};

    不同之处是${var:=string}常用于判断var是否赋值,没有的话则给var赋上一个默认值。

    ② ${var:+string}:和上面的相反

    即只有当var非空, 替换成string;若var为空则不替换或者说是替换成变量 var的值,即空值。

    (因为变量var此时为空,所以这两种说法是等价的) 

     ③${var:?string}:

    替换规则为:若var不为空,则用var的值来替换${var:?string};若var为空,则把string输出到标准错误中,并从脚本中退出。

    可利用此特性来检查是否设置了变量的值。

    注意:在上面这五种替换结构中string不一定是常值的,可用另外一个变量的值或是一种命令的输出。

    模式匹配替换
    ${var%pattern},${var%%pattern},${var#pattern},${var##pattern}

    # 是去掉左边(在键盘上#在$之左边);% 是去掉右边(在键盘上%在$之右边);

    #和%中的单一符号是最小匹配,两个相同符号是最大匹配。

    第一种模式:${variable%pattern}。shell在variable中查找,看它是否以模式pattern结尾,如果是,把variable去掉右边最短的匹配模式

     第二种模式: ${variable%%pattern},这种模式时,shell在variable中查找,看它是否以给的模式pattern结尾,如果是,把variable中去掉右边最长的匹配模式

    第三种模式:${variable#pattern} 这种模式时,shell在variable中查找,看它是否以给的模式pattern开始,如果是,把variable中去掉左边最短的匹配模式

     第四种模式: ${variable##pattern} 这种模式时,shell在variable中查找,看它是否以给的模式pattern结尾,如果是,把variable中去掉左边最长的匹配模式

     这四种模式中都不会改变variable的值,其中,只有在pattern中使用了*匹配符号时,%和%%,#和##才有区别。结构中的pattern支持通配符,*表示零个或多个任意字符,?表示仅与一个任意字符匹配,[...]表示匹配中括号里面的字符,[!...]表示不匹配中括号里面的字符。

    # var=testcase 
    # echo $var 
    testcase 
    # echo ${var%s*e} 
    testca 
    # echo $var 
    testcase 
    # echo ${var%%s*e} 
    te 
    # echo ${var#?e} 
    stcase 
    # echo ${var##?e} 
    stcase 
    # echo ${var##*e} 
    
    # echo ${var##*s} 
    e 
    # echo ${var##test} 
    case 

    字符串提取和替换

    ${var:num}, ${var:num1:num2}, ${var/pattern/pattern}, ${var//pattern/pattern}

     第一种模式:${var:num},shell在var中提取第num个字符到末尾的所有字符。若num为正数,从左边0处开始;若num为负数,从右边开始提取字串,但必须使用在冒号后面加空格或一个数字或整个num加上括号,如${var: -2}、${var:1-3}或${var:(-2)}。    

    第二种模式:${var:num1:num2},num1是位置,num2是长度。表示从$var字符串的第$num1个位置开始提取长度为$num2的子串。不能为负数。

    第三种模式:${var/pattern/pattern}表示将var字符串的第一个匹配的pattern替换为另一个pattern。

    第四种模式:${var//pattern/pattern}表示将var字符串中的所有能匹配的pattern替换为另一个pattern。

    [root@centos ~]# var=/home/centos 
    [root@centos ~]# echo $var 
    /home/centos 
    [root@centos ~]# echo ${var:5} 
    /centos 
    [root@centos ~]# echo ${var: -6} 
    centos 
    [root@centos ~]# echo ${var:(-6)} 
    centos 
    [root@centos ~]# echo ${var:1:4} 
    home 
    [root@centos ~]# echo ${var/o/h} 
    /hhme/centos 
    [root@centos ~]# echo ${var//o/h} 
    /hhme/cenths 
     

    符号$后的括号

    (1)${a} 变量a的值,

    (2)$(cmd) 命令替换,和`cmd`效果相同,结果为shell命令cmd的输,过某些Shell版本不支持$()形式的命令替换, 如tcsh。

    (3)$((expression)) 和`exprexpression`效果相同, 计算数学表达式exp的数值, 其中exp只要符合C语言的运算规则即可, 甚至三目运算符和逻辑表达式都可以计算。

     多条命令执行

    (1)单小括号,(cmd1;cmd2;cmd3) 新开一个sub shell顺序执行命令cmd1,cmd2,cmd3, 各命令之间用分号隔开, 最后一个命令后可以没有分号。

    (2)单大括号,{ cmd1;cmd2;cmd3;} 在当前shell顺序执行命令cmd1,cmd2,cmd3, 各命令之间用分号隔开, 最后一个命令后必须有分号, 第一条命令和左括号之间必须用空格隔开。
    对{}和()而言, 括号中的重定向符只影响该条命令, 而括号外的重定向符影响到括号中的所有命令。

  • 相关阅读:
    jQuery 语法
    jQuery 简介
    把数据存储到 XML 文件
    XML 注意事项
    XML DOM (Document Object Model) 定义了访问和操作 XML 文档的标准方法。
    通过 PHP 生成 XML
    XML 命名空间(XML Namespaces)
    XML to HTML
    XMLHttpRequest 对象
    使用 XSLT 显示 XML
  • 原文地址:https://www.cnblogs.com/wsy0202/p/12102619.html
Copyright © 2020-2023  润新知