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
  • 相关阅读:
    LNMP架构三
    LNMP架构二
    LNMP架构
    LAMP架构三
    LAMP架构二
    LAMP架构
    rsync工具介绍
    mysqldump备份单表数据
    阿铭每日一题 day 14 20180125
    阿铭每日一题 day 13 20180124
  • 原文地址:https://www.cnblogs.com/zyy98877/p/10168475.html
Copyright © 2011-2022 走看看