• Shell变量的取用、删除、取代与替换


    <<鸟哥的私房菜>>

    注意:

    通配符适用的地方:shell命令行或者shell脚本中

    正则表达式适用的地方:字符串处理时,一般有一般正则和Perl正则。

    在文本过滤工具里,都是用正则表达式,比如像awk,sed,等,是针对文件的内容的

    而通配符多用在文件名上,比如查找find,ls,cp,等等

    #!/bin/bash
    path=${PATH}
    echo $path
    #/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games
    
    
    # #和%的删除功能
    echo "#从前往后匹配"
    # "#":符合取代文字的『最短的』那一个
    # *local/bin: 匹配"/usr/local/sbin:/usr/local/bin:"
    # 这里的"*"为通配符,匹配0到无穷多个任意字符
    echo ${path#/*local/bin:}
    
    # "##":符合取代文字的『最长的』那一个
    #删除前面所有的目录,仅保留最后一个目录
    echo ${path##/*:}
    
    # %从后往前
    echo "%从后往前"
    echo ${path%:*games}
    
    # %%从后往前匹配最长的
    echo ${path%%:*games}
    
    
    echo "将path的变量内容内的 sbin 取代成大写 SBIN"
    #两斜线中间的是旧字符串,后面的是新字符串
    # sh test.sh出现"Bad substitution". bash test.sh和./tesh.sh正常
    echo ${path/sbin/SBIN}
    # 如果是两条斜线,那么就变成所有符合的内容都会被取代
    echo ${path//sbin/SBIN}
    
    
    echo "『判断』某个变量是否存在,若变量存在则使用既有的配置,若变量不存在则给予一个常用的配置。"
    echo $username
    echo "因为 username 没有配置,所以主动给予名为 root 的内容."
    username=${username-root}
    echo $username
    
    echo "因为 username 已经配置了,所以使用旧有的配置而不以 root 取代"
    username="vbird tsai"
    username=${username-root}
    echo $username
    
    echo "若 username 未配置或为空字符串,则将 username 内容配置为 root"
    #因为 username 被配置为空字符串了!所以当然还是保留为空字符串!
    username=""
    username=${username-root}
    echo $username
    
    echo "加上『 : 』后若变量内容为空或者是未配置,都能够以后面的内容替换!"
    username=${username:-root}
    echo $username

    变量的取用: echo

    echo $variable
    echo $PATH
    echo ${PATH}

    变量的配置守则
    1.变量与变量内容以一个等号『=』来连结,如下所示: 
      『myname=VBird』

    2.等号两边不能直接接空格符,如下所示为错误: 
      『myname = VBird』或『myname=VBird Tsai』

    3.变量名称只能是英文字母与数字,但是开头字符不能是数字,如下为错误: 
      『2myname=VBird』

    4.变量内容若有空格符可使用双引号『"』或单引号『'』将变量内容结合起来,但
    双引号内的特殊字符如 $ 等,可以保有原本的特性,如下所示:
      『var="lang is $LANG"』则可得『lang is en_US』
    单引号内的特殊字符则仅为一般字符 (纯文本),如下所示:
      『var='lang is $LANG‘』则得『lang is $LANG』

    5.可用跳脱字符『 』将特殊符号(如 [Enter], $, \, 空格符, '等)变成一般字符;

    6.在一串命令中,还需要藉由其他的命令提供的信息,可以使用反单引号『`命令`』或 『$(命令)』。特别注意,那个 ` 是键盘上方的数字键 1 左边那个按键,而不是单引号! 例如想要取得核心版本的配置:
      『version=$(uname -r)』再『echo $version』可得『2.6.18-128.el5』

    7.若该变量为扩增变量内容时,则可用"$变量"或${变量} 累加内容,如下所示:
      『PATH="$PATH":/home/bin』

    PS.我一般用${变量},在变量拼接的时候尤其重要,name=$nameyes,name的内容是$nameyes 这个变量;name=${name}yes,可以把$name和yes拼接起来

    8.若该变量需要在其他子程序运行,则需要以 export 来使变量变成环境变量:
      『export PATH』

    9.通常大写字符为系统默认变量,自行配置变量可以使用小写字符,方便判断 (纯粹依照使用者兴趣与嗜好) ;

    10.取消变量的方法为使用 unset :『unset 变量名称』例如取消 myname 的配置:
      『unset myname』

    变量内容的删除、取代与替换

    范例一:先让小写的 path 自定义变量配置的与 PATH 内容相同
      path=${PATH}
      echo $path
      /usr/kerberos/sbin:/usr/kerberos/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin

    范例二:假设要将前两个目录删除掉,如何显示?

      echo ${path#/*kerberos/bin:}
      /usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin

    解释:

    范例三:我想要删除前面所有的目录,仅保留最后一个目录

      echo ${path##/*:}
      /root/bin

    多加了一个 # 变成 ## 之后,变成『删除掉最长的那个数据』

    • # :符合取代文字的『最短的』那一个;
    • ##:符合取代文字的『最长的』那一个

    如果想要『从后面向前删除变量内容』呢? 这个时候就得使用百分比 (%) 符号了

    范例四:我想要删除最后面那个目录,亦即从 : 到 bin 为止的字符串

      echo ${path%:*bin}
      /usr/kerberos/sbin:/usr/kerberos/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin

    范例五:那如果我只想要保留第一个目录呢?

      echo ${path%%:*bin}
      /usr/kerberos/sbin

    了解了删除功能后,接下来谈谈取代吧

    范例六:将 path 的变量内容内的 sbin 取代成大写 SBIN:
      echo ${path/sbin/SBIN}
      /usr/kerberos/SBIN:/usr/kerberos/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin
    这个部分就容易理解的多了!关键词在于那两个斜线,两斜线中间的是旧字符串,后面的是新字符串

      echo ${path//sbin/SBIN}
      /usr/kerberos/SBIN:/usr/kerberos/bin:/usr/local/SBIN:/usr/local/bin:/SBIN:/bin:/usr/SBIN:/usr/bin:/root/bin
    如果是两条斜线,那么就变成所有符合的内容都会被取代

    总结

    变量配置方式 说明
    ${变量#关键词}
    ${变量##关键词}
    若变量内容从头开始的数据符合『关键词』,则将符合的最短数据删除
    若变量内容从头开始的数据符合『关键词』,则将符合的最长数据删除
    ${变量%关键词}
    ${变量%%关键词}
    若变量内容从尾向前的数据符合『关键词』,则将符合的最短数据删除
    若变量内容从尾向前的数据符合『关键词』,则将符合的最长数据删除
    ${变量/旧字符串/新字符串}
    ${变量//旧字符串/新字符串}
    若变量内容符合『旧字符串』则『第一个旧字符串会被新字符串取代』
    若变量内容符合『旧字符串』则『全部的旧字符串会被新字符串取代』

    变量的测试与内容替换

    在某些时刻我们常常需要『判断』某个变量是否存在,若变量存在则使用既有的配置,若变量不存在则给予一个常用的配置。

    范例一:测试一下是否存在 username 这个变量,若不存在则给予 username 内容为 root
      echo $username
            <==由于出现空白,所以 username 可能不存在,也可能是空字符串
      username=${username-root}
      echo $username
      root     <==因为 username 没有配置,所以主动给予名为 root 的内容。
      username="vbird tsai" <==主动配置 username 的内容
      username=${username-root}
      echo $username
      vbird tsai   <==因为 username 已经配置了,所以使用旧有的配置而不以 root 取代

    范例二:若 username 未配置或为空字符串,则将 username 内容配置为 root
      username=""
      username=${username-root}
      echo $username
          <==因为 username 被配置为空字符串了!所以当然还是保留为空字符串!
      username=${username:-root}
      echo $username
      root   <==加上『 : 』后若变量内容为空或者是未配置,都能够以后面的内容替换!

    变量配置方式 str 没有配置 str 为空字符串 str 已配置非为空字符串
    var=${str-expr} var=expr var= var=$str
    var=${str:-expr} var=expr var=expr var=$str
    var=${str+expr} var= var=expr var=expr
    var=${str:+expr} var= var= var=expr
    var=${str=expr} str=expr
    var=expr
    str 不变
    var=
    str 不变
    var=$str
    var=${str:=expr} str=expr
    var=expr
    str=expr
    var=expr
    str 不变
    var=$str
    var=${str?expr} expr 输出至 stderr var= var=$str
    var=${str:?expr} expr 输出至 stderr expr 输出至 stderr var=$str
  • 相关阅读:
    HDU 1087 Super Jumping! Jumping! Jumping!
    HDU 1159 Common Subsequence
    HDU 1003 Maxsum
    HDU 2604 Queuing
    HDU 2045 不容易系列之(3)—— LELE的RPG难题
    HDU 2501 Tiling_easy version
    HDU 2050 折线分割平面
    HDU 2018 母牛的故事
    HDU 2046 骨牌铺方格
    HDU 2044 一只小蜜蜂...
  • 原文地址:https://www.cnblogs.com/guxuanqing/p/9245548.html
Copyright © 2020-2023  润新知