• Shell 处理字符串和{}操作


    Shell 处理字符串和{}操作

    1. 获取变量的长度

    获取字符串长度的方法大概有4种:(以hello world 为例)

    • 通过 wc -L

       $ echo "hello world" | wc -L   
       11
      
    • 通过expr length string

      $ expr length "hello world"
      11
      
    • 通过awk内置的length函数

      $ echo "hello world" | awk '{print length($0)}'
      11
      
    • 通过echo ${#string_name}

      $ string='hello world'
      $ echo ${#string}
      11
      

    2. 截取变量 by {}操作

    • # 操作符 -- 从最左边开始到第一次出现子字符串的地方,全部删除

      $echo $string
      hello world
      
      $echo ${string#*l}
      lo world
      
      $echo ${string#*ll}
      o world
      
      $echo ${string#*llo}
      world
      
      $echo ${string#llo}
      hello world
      

    注意: 这里需要用*来匹配,否则就像最后一个一样无效,另外倒数第二中把开头的空格去掉了,这个应该是shell的一种默认赋值,会将变量开头的空格去掉。例如:

    $str1=" hello"
    
    $echo $str1
    hello
    
    • ##是从最左边开始匹配到最后出现子字符串的地方

      $echo ${string##*l}
      d
      
    • %是从最右边开始匹配到第一个出现子字符串的地方,*号放在匹配子字符串的右边

      $echo ${string%l*}
      hello wor
      
    • %%是从最右边开始匹配到最后出现子字符串的地方

      $echo ${string%%l*}
      he
      
    • ${string:m:n} 操作

    注意:

    左边第一个下标用 0 表示
    右边第一个下表用 0-1 表示,右边第二个用 0-2 表示, 依次类推 n 表示字符的个数,不是下标
    ${string:3} 这里的3表示从左边第4个开始

    $echo $string
    hello world
    
    $echo ${string:0:2}
    he
    
    $echo ${string:0-2:2}
    ld
    
    $echo ${string:2}
    llo world
    

    3. 参数替换和扩展 -- by {} 操作

    • ${str-value} 如果str没有被申明,则赋值value

    • ${str:-value} 如果str没有被申明或者值为空,则赋值value

      $var=
      
      $echo ${var-helo}   -- 此时变量var为空
      
      $echo ${var:-helo}
      helo
      
    • ${str+value} 如果不管str为何值,均使用value作为默认值

    • ${str:+value} 除非str为空,否则均使用value作为默认值

    • ${str=value} 如果str没有被申明,则使用value作为默认值,同时将str赋值为value

    • ${str:=value} 如果str没有被申明,或者为空,则使用value作为默认值,同时将str赋值为value

    • ${str?value} 如果str没有被申明,输出value到STDERR

    • ${str:?value} 如果str没有被申明,或者为空,输出value到STDERR

    • ${!var} 间接变量引用

      $echo $string
      hello world
      
      $str="string"
      
      $echo ${!str}
      hello world
      
    • ${!prefix*} 匹配之前所有以prefix开头申明的变量

    • ${!prefix@} 匹配之前所有以prefix开头申明的变量

      $cat test.sh 
      c_var1="hello"
      c_var2="world"
      
      for c in ${!c_*}; do
          echo "${c}=${!c}"
      done
      
      $sh test.sh 
      c_var1=hello
      c_var2=world
      

    4. 字符串替换 -- by {}操作

    • ${string/str1/str2},用str2替换从左边数第一个str1

    • ${string//str1/str2},用str2替换全部str1

    • ${string/#str1/str2},如果string的前缀是str1,则将其替换为str2

    • ${string/%str1/str2},如果string的后缀是str1,则将其替换为str2

      $echo ${string/l/s}
      heslo world
      
      $echo ${string//l/s}
      hesso worsd
      
      $echo ${string/#he/h}
      hllo world
      
      $echo ${string/%ld/d}
      hello word
      
  • 相关阅读:
    互联网、云大数据相关书籍推荐
    育儿、教育书籍推荐
    MySQL客户端工具的选择
    解决Windows10或者其他版本Windows Update报错的问题
    启动Myeclipse报错“Failed to create the Java Virtual Machine”的解决办法
    mysql的日期存储字段比较int,datetime,timestamp区别
    nginx增加ssl服务方法
    mysql导入出现MySQL Error 1153
    mysql忘记密码修改方法
    清空本地ssh记录数据,ssh: connect to host Ip port 22: Connection refused
  • 原文地址:https://www.cnblogs.com/zk47/p/4209511.html
Copyright © 2020-2023  润新知