zoukankan      html  css  js  c++  java
  • Linux Shell脚本攻略:shell中各种括号()、(())、[]、[[]]、{}的作用

    转自:https://www.cnblogs.com/nkwy2012/p/9171414.html

    技巧小结:

    字符串比较用双中括号[[ ]];算数比较用单中括号[ ]——左右留空格

    算数运算用双小括号(( )) ;shell命令及输出用小括号( )——左右不留空格

    快速替换用花括号{ }——左右留空格

    反单引号起着命令替换的作用` `

    ----------------------------------------------------------------------------------------------------------------

    单括号():

    另开命令组——小括号中的内容会开启一个子shell独立运行;括号中以分号连接,最后一个命令不需要;各命令和括号无空格

    得到命令输出——a=$(command), 等同于a=$`command`,得到命令输出传递给变量a

    初始化数组——array=(a b c d)

    双括号(()):

    省去$符号的算术运算—— for((i=0;i<5;i++)); if (($i<5)); a=5; ((a++)) 可将 $a 重定义为6;括号内支持多个表达式用逗号分开。 

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

    跨进制运算——二进制、八进制、十六进制运算时,输出结果全都自动转化成了十进制。如:echo $((16#5f)) 结果为95 (16进位转十进制)

    单中括号[ ]:

    字符串比较——==和!=

    整数比较——不等于:-gt:大于;-lt :小于;-eq:等于;-ne

    数组索引——array[0]

    双中括号[[]]:

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

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

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

    [plain] view plain copy
     
    1. if ($i<5)      
    2. if [ $i -lt 5 ]      
    3. if [ $a -ne 1 -a $a != 2 ]      
    4. if [ $a -ne 1] && [ $a != 2 ]      
    5. if [[ $a != 1 && $a != 2 ]]      
    6.        
    7. for i in $(seq 0 4);do echo $i;done      
    8. for i in `seq 0 4`;do echo $i;done      
    9. for ((i=0;i<5;i++));do echo $i;done      
    10. 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支持通配符,*表示零个或多个任意字符,?表示仅与一个任意字符匹配,[...]表示匹配中括号里面的字符,[!...]表示不匹配中括号里面的字符。

    [plain] view plain copy
     
    1. # var=testcase      
    2. # echo $var      
    3. testcase      
    4. # echo ${var%s*e}     
    5. testca      
    6. # echo $var      
    7. testcase     
    8. # echo ${var%%s*e}     
    9. te    
    10. # echo ${var#?e}      
    11. stcase    
    12. # echo ${var##?e}      
    13. stcase    
    14. # echo ${var##*e}      
    15.     
    16. # echo ${var##*s}      
    17. e      
    18. # echo ${var##test}      
    19. 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。

    [plain] view plain copy
     
    1. [root@centos ~]# var=/home/centos    
    2. [root@centos ~]# echo $var    
    3. /home/centos    
    4. [root@centos ~]# echo ${var:5}    
    5. /centos    
    6. [root@centos ~]# echo ${var: -6}    
    7. centos    
    8. [root@centos ~]# echo ${var:(-6)}    
    9. centos    
    10. [root@centos ~]# echo ${var:1:4}    
    11. home    
    12. [root@centos ~]# echo ${var/o/h}    
    13. /hhme/centos    
    14. [root@centos ~]# echo ${var//o/h}    
    15. /hhme/cenths    

    对{}和()而言, 括号中的重定向符只影响该条命令, 而括号外的重定向符影响到括号中的所有命令。

    ----------------------------------------------------------------------------------------------------------------

    符号$后的括号

    (1)${a} 变量a的值, 在不引起歧义的情况下可以省略大括号。

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

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

  • 相关阅读:
    Security and Cryptography in Python
    Security and Cryptography in Python
    Security and Cryptography in Python
    Security and Cryptography in Python
    Security and Cryptography in Python
    Security and Cryptography in Python
    Security and Cryptography in Python
    《EffectiveJava中文第二版》 高清PDF下载
    《MoreEffectiveC++中文版》 pdf 下载
    《啊哈c语言》 高清 PDF 下载
  • 原文地址:https://www.cnblogs.com/JIKes/p/11638033.html
Copyright © 2011-2022 走看看