• 【转】变量的测试与内容替换


    转自:http://vbird.dic.ksu.edu.tw/linux_basic/0320bash_2.php

    在某些时刻我们常常需要『判断』某个变量是否存在,若变量存在则使用既有的配置,若变量不存在则给予一个常用的配置。 我们举底下的例子来说明好了,看看能不能较容易被你所理解呢!

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

    在上面的范例中,重点在于减号『 - 』后面接的关键词!基本上你可以这样理解:

    new_var=${old_var-content}
       新的变量,主要用来取代旧变量。新旧变量名称其实常常是一样的
    
    new_var=${old_var-content}
       这是本范例中的关键词部分!必须要存在的哩!
    
    new_var=${old_var-content}
       旧的变量,被测试的项目!
    
    new_var=${old_var-content}
       变量的『内容』,在本范例中,这个部分是在『给予未配置变量的内容』
    

    不过这还是有点问题!因为 username 可能已经被配置为『空字符串』了!果真如此的话,那你还可以使用底下的范例来给予 username 的内容成为 root 喔!

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

    在大括号内有没有冒号『 : 』的差别是很大的!加上冒号后,被测试的变量未被配置或者是已被配置为空字符串时, 都能够用后面的内容 (本例中是使用 root 为内容) 来替换与配置!这样可以了解了吗?除了这样的测试之外, 还有其他的测试方法喔!鸟哥将他整理如下:

    Tips:
    底下的例子当中,那个 var 与 str 为变量,我们想要针对 str 是否有配置来决定 var 的值喔! 一般来说, str: 代表『str 没配置或为空的字符串时』;至于 str 则仅为『没有该变量』。
    鸟哥的图示

    变量配置方式 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

    根据上面这张表,我们来进行几个范例的练习吧! ^_^!首先让我们来测试一下,如果旧变量 (str) 不存在时, 我们要给予新变量一个内容,若旧变量存在则新变量内容以旧变量来替换,结果如下:

    测试:先假设 str 不存在 (用 unset) ,然后测试一下减号 (-) 的用法:
    [root@www ~]# unset str; var=${str-newvar}
    [root@www ~]# echo var="$var", str="$str"
    var=newvar, str=        <==因为 str 不存在,所以 var 为 newvar
    
    测试:若 str 已存在,测试一下 var 会变怎样?:
    [root@www ~]# str="oldvar"; var=${str-newvar}
    [root@www ~]# echo var="$var", str="$str"
    var=oldvar, str=oldvar  <==因为 str 存在,所以 var 等于 str 的内容
    

    关于减号 (-) 其实上面我们谈过了!这里的测试只是要让你更加了解,这个减号的测试并不会影响到旧变量的内容。 如果你想要将旧变量内容也一起替换掉的话,那么就使用等号 (=) 吧!

    测试:先假设 str 不存在 (用 unset) ,然后测试一下等号 (=) 的用法:
    [root@www ~]# unset str; var=${str=newvar}
    [root@www ~]# echo var="$var", str="$str"
    var=newvar, str=newvar  <==因为 str 不存在,所以 var/str 均为 newvar
    
    测试:如果 str 已存在了,测试一下 var 会变怎样?
    [root@www ~]# str="oldvar"; var=${str=newvar}
    [root@www ~]# echo var="$var", str="$str"
    var=oldvar, str=oldvar  <==因为 str 存在,所以 var 等于 str 的内容
    

    那如果我只是想知道,如果旧变量不存在时,整个测试就告知我『有错误』,此时就能够使用问号『 ? 』的帮忙啦! 底下这个测试练习一下先!

    测试:若 str 不存在时,则 var 的测试结果直接显示 "无此变量"
    [root@www ~]# unset str; var=${str?无此变量}
    -bash: str: 无此变量    <==因为 str 不存在,所以输出错误信息 
    
    测试:若 str 存在时,则 var 的内容会与 str 相同!
    [root@www ~]# str="oldvar"; var=${str?novar}
    [root@www ~]# echo var="$var", str="$str"
    var=oldvar, str=oldvar  <==因为 str 存在,所以 var 等于 str 的内容
    

    基本上这种变量的测试也能够透过 shell script 内的 if...then... 来处理, 不过既然 bash 有提供这么简单的方法来测试变量,那我们也可以多学一些嘛! 不过这种变量测试通常是在程序设计当中比较容易出现,如果这里看不懂就先略过,未来有用到判断变量值时,再回来看看吧! ^_^

  • 相关阅读:
    第k小元素学习记录
    线段树学习笔记
    数论方面的知识积累
    javascript 例子
    数据绑定以及Container.DataItem的具体分析
    C#委托和事件
    C#中的特性(Attributes)(翻译)
    gridview和repeater中取得行的序号
    理解 Ajax 及其工作原理,构建网站的一种有效方法
    JS数组对象参考
  • 原文地址:https://www.cnblogs.com/Andy-Lv/p/5309949.html
Copyright © 2020-2023  润新知