zoukankan      html  css  js  c++  java
  • shell编程之 ()[] {}

    shell脚本中各种括号的区别以及用法

    最近学到了shell脚本编程,觉得脚本中的不同括号有不同的用处,以及有些括号的格式也有特殊要求,下面我就总结一下各种括号的用法。

    一、小括号();双小括号(())

      1、单小括号 ()

        1:命令替换。等同于`comm`,shell扫描一遍命令行,发现了$(comm)结构,便将$(comm)中的comm执行一次,得到其标准输出,再将此输出放到原来命令。

    1.  
      # ls
    2.  
      a b c
    3.  
      # echo $(ls)
    4.  
      a b c
    5.  
      #echo `ls`
    6.  
      a b c

        2:用于初始化数组。如:array=(a b c d)

    1.  
      [root@localhost ~]# array=(a b c d)
    2.  
      [root@localhost ~]# declare -a
    3.  
      declare -a array='([0]="a" [1]="b" [2]="c" [3]="d")'

      2、双小括号 (())
    ((表达式))常用于算术运算比较,双括号中的变量可以不使用$符号前缀。括号内支持多个表达式用逗号分开。 只要括号中的表达式符合C语言运算规则,比如可以直接使用for((i=0;i<5;i++)), 如果不使用双括号, 则为for i in `seq 0 4`或者for i in {0..4}。再如可以直接使用if (($i<5)), 如果不使用双括号, 则为if [ $i -lt 5 ]。

    1.  
      #求100以内的偶数
    2.  
       
    3.  
      #! /bin/bash
    4.  
      num=2
    5.  
      while ((num<100)) #数值与运算符可以没有空格,变量的使用时也可以不使用$num
    6.  
      do
    7.  
      echo "$num"
    8.  
      ((num=num*2))
    9.  
      done

    二、中括号[ ];双中括号[[ ]]

    1:单中括号[ ]

    1:算术比较, 比如一个变量是否为0, [ $var -eq 0 ]

    1.  
      [ $var1 -ne 0 -a $var2 -gt 2 ] # 使用逻辑与 -a
    2.  
      [ $var1 -ne 0 -o $var2 -gt 2 ] # 使用逻辑或 -o

    对变量或值进行算术条件判断:

    1.  
      [ $var -eq 0 ] # 当 $var 等于 0 时,返回真
    2.  
      [ $var -ne 0 ] # 当 $var 不等于 0 时,返回真

    需要注意的是 [ 与 ] 与操作数之间一定要有一个空格,否则会报错。比如下面这样就会报错:

    [$var -eq 0 ]  或 [ $var -ne 0] 

    其他比较操作符:

    操作符意义
    -gt 大于
    -lt 小于
    -ge 大于或等于
    -le 小于或等于

    可以通过 -a (and) 或 -o (or) 结合多个条件进行测试:

    1.  
      [ $var1 -ne 0 -a $var2 -gt 2 ] # 使用逻辑与 -a
    2.  
      [ $var1 -ne 0 -o $var2 -gt 2 ] # 使用逻辑或 -o

    2:文件属性测试,比如一个文件是否存在,[ -e $var ], 是否是目录,[ -d $var ]

    文件系统属性测试

    使用不同的条件标志测试不同的文件系统属性。

    操作符意义
    [ -f $file_var ] 变量 $file_var 是一个正常的文件路径或文件名 (file),则返回真
    [ -x $var ] 变量 $var 包含的文件可执行 (execute),则返回真
    [ -d $var ] 变量 $var 包含的文件是目录 (directory),则返回真
    [ -e $var ] 变量 $var 包含的文件存在 (exist),则返回真
    [ -c $var ] 变量 $var 包含的文件是一个字符设备文件的路径 (character),则返回真
    [ -b $var ] 变量 $var 包含的文件是一个块设备文件的路径 (block),则返回真
    [ -w $var ] 变量 $var 包含的文件可写(write),则返回真
    [ -r $var ] 变量 $var 包含的文件可读 (read),则返回真
    [ -L $var ] 变量 $var 包含是一个符号链接 (link),则返回真

    使用方法如下:

    1.  
      fpath="/etc/passwd"
    2.  
      if [ -e $fpath ]; then
    3.  
      echo File exits;
    4.  
      else
    5.  
      echo Does not exit;
    6.  
      fi

        3:字符范围。用作正则表达式的一部分,描述一个匹配的字符范围。作为test用途的中括号内不能使用正则。

    1.  
      [root@localhost ~]# echo 1234abcdef |tr -cd "[0-9]"
    2.  
      1234[root@localhost ~]# cat 1.txt|grep "[0-9]"
    3.  
      123
    4.  
      135
    5.  
      1244
    6.  
      156
    7.  
      222
    8.  
      178
    9.  
      189999
    10.  
      12gg
    11.  
      [root@localhost ~]#

        4:在一个array 结构的上下文中,中括号用来引用数组中每个元素的编号

    1.  
      [root@localhost ~]# echo ${name[2]}
    2.  
      durank
    3.  
      [root@localhost ~]#

    2:双中括号 [[ ]]

    [[ ]] 多用来进行字符串比较, 比如两个字符串是否相同, [[ $var1 == $var2 ]]

    注意 = 前后有一个空格,如果忘记加空格, 就变成了赋值语句,而非比较关系了。

    字符串的其他比较情况:

    操作符意义
    [[ $str1 != $str2 ]] 如果 str1 与 str2 不相同,则返回真
    [[ -z $str1 ]] 如果 str1 是空字符串,则返回真
    [[ -n $str1 ]] 如果 str1 是非空字符串,则返回真

    使用逻辑运算符 && 和 || 可以轻松地将多个条件组合起来, 比如:

    1.  
      str1="Not empty"
    2.  
      str2=""
    3.  
      if [[ -n $str1 ]] && [[ -z $str2 ]];
    4.  
      then
    5.  
      echo str1 is nonempty and str2 is empty string.
    6.  
      fi

    test 命令也可以从来执行条件检测,用 test 可以避免使用过多的括号,[] 中的测试条件同样可以通过 test 来完成。

    if [ $var -eq 0 ]; then echo "True"; fi

      等价于

    if test $var -eq 0; then echo "True"; fi

    三:大括号{ }

    常规用法

    1:大括号拓展。在大括号中,不允许有空白,除非这个空白被引用或转义。

    第一种:对大括号中的以逗号分割的文件列表进行拓展。

    第二种:对大括号中以点点(..)分割的顺序文件列表起拓展作用,

    1.  
      # ls {ex1,ex2}.sh
    2.  
      ex1.sh ex2.sh
    3.  
      # ls {ex{1..3},ex4}.sh
    4.  
      ex1.sh ex2.sh ex3.sh ex4.sh
    5.  
      # ls {ex[1-3],ex4}.sh
    6.  
      ex1.sh ex2.sh ex3.sh ex4.sh

    2:字符串提取和替换

    ${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。

    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

    字符大小写转换
    ${var^^}:把var中的所有小写字母转换为大写
    ${var,,}:把var中的所有大写字母转换为

    引用:https://blog.csdn.net/qq_27281257/article/details/81837040
  • 相关阅读:
    1058 A+B in Hogwarts (20)
    1036. Boys vs Girls (25)
    1035 Password (20)
    1027 Colors in Mars (20)
    1009. Product of Polynomials (25)
    1006. Sign In and Sign Out
    1005 Spell It Right (20)
    1046 Shortest Distance (20)
    ViewPager页面滑动,滑动到最后一页,再往后滑动则执行一个事件
    IIS7.0上传文件限制的解决方法
  • 原文地址:https://www.cnblogs.com/zyy98877/p/10168475.html
Copyright © 2011-2022 走看看