两种变数取用的方法,分别是这样:

[root@linux ~]# echo $HOME

[root@linux ~]# echo ${HOME}

那么,在那个 ${variable} 的使用方法中,其实,我们还可以将变数进行一些修订的工作喔! 只要加上一些字符标志,后面再接着使用比对字串,就能够修改变数的内容了!我们取底下的例子来说明:在底下的例子中,假设我的变数名称为 vbird ,且内容为 /home/vbird/testing/testing.x.sh。

1. 完整呈现 vbird 这个变数的内容;

[root@linux ~]# vbird="/home/vbird/testing/testing.x.sh"

[root@linux ~]# echo ${vbird}

/home/vbird/testing/testing.x.sh

2. 在 vbird 变数中,从最前面开始比对,若开头为 / ,则删除两个 /

   之间的所有资料,亦即 /*/

[root@linux ~]# echo ${vbird##/*/}

testing.x.sh    <==删除了 /home/vbird/testing/

[root@linux ~]# echo ${vbird#/*/}

vbird/testing/testing.x.sh   <==仅删除 /home/ 而已

# 这两个小例子有趣了~变数名称后面如果接了两个 ## ,表示在 ##

# 后面的字串取‘最长的’那一段;如果仅有一个 # ,表示取‘最小的那一段’喔!

3. 呈上题,如果是从后面开始,删除 /* 呢?

[root@linux ~]# echo ${vbird%%/*/}

/home/vbird/testing/testing.x.sh <==都没被删除

[root@linux ~]# echo ${vbird%%/*}

    <==被删除光了!

[root@linux ~]# echo ${vbird%/*}

/home/vbird/testing   <==只删除 /testing.x.sh 部分

# 这个例子当中需要特别注意,那个 % 比对的是‘最后面那个字元’的意思,

# 所以啰,第一个方式当然不对~因为 vbird 这个变数的内容最后面是 h 而不是 / 啊!

# 至于 %%/* 则是删除‘最长的那个 /* ’,当然就是全部喔!而 %/* 则是最短的那个!

4. 将 vbird 变数中的 testing 取代为 TEST

[root@linux ~]# echo ${vbird/testing/TEST}

/home/vbird/TEST/testing.x.sh

[root@linux ~]# echo ${vbird//testing/TEST}

/home/vbird/TEST/TEST.x.sh

# 如果变数后面接的是 / 时,那么表示后面是进行‘取代’的工作~而且仅取代‘第一个’

# 但如果是 // ,则表示全部的字串都取代啊!

这里您稍微留意一下就好了~反正就是变数后面可以接 #, ##, %, %%, /, // , 而他们存在的意义并不相同的啦~

另外,几个不同的变数内容还可以进行判断呢! 举例来说,目前我需要用到两个变数,分别是 var 与 str , 那我想要针对 str 这个变数内容是否有设定成一个字串,亦即 "expr" 来决定 var 的内容。 那我可以使用什么方法来进行判断呢?如果您会写 shell script 的话, 直接用 shell script 就好了,如果不会写,那么我们就透过简单的变数判断吧!

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=expr

var=expr

var=expr

var=${str:+expr}

var=expr

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 这个变数内容存在,则 var 设定为 str ,否则 var 设定为 "newvar"

[root@linux ~]# unset str; var=${str-newvar}

[root@linux ~]# echo var="$var", str="$str"

var=newvar, str=        <==因为 str 不存在,所以 var 为 newvar

[root@linux ~]# str="oldvar"; var=${str-newvar}

[root@linux ~]# echo var="$var", str="$str"

var=oldvar, str=oldvar <==因为 str 存在,所以 var 等于 str 的内容

范例二:若 str 不存在,则 var 与 str 均设定为 newvar,否则仅 var 为 newvar

[root@linux ~]# unset str; var=${str=newvar}

[root@linux ~]# echo var="$var", str="$str"

var=newvar, str=newvar <==因为 str 不存在,所以 var/str 均为 newvar

[root@linux ~]# str="oldvar"; var=${str=newvar}

[root@linux ~]# echo var="$var", str="$str"

var=oldvar, str=oldvar <==因为 str 存在,所以 var 等于 str 的内容

范例三:若 str 这个变数存在,则 var 等于 str ,否则输出 "novar"

[root@linux ~]# unset str; var=${str?novar}

-bash: str: novar       <==因为 str 不存在,所以输出错误讯息

[root@linux ~]# str="oldvar"; var=${str?novar}

[root@linux ~]# echo var="$var", str="$str"

var=oldvar, str=oldvar <==因为 str 存在,所以 var 等于 str 的内容

# 上面这三个案例都没有提到当 str 有设定,且为空字串的情况喔!

# 您可以自行测试一下哩!

虽然猛一看,觉得变数没有什么奇特的地方,但是,如果仔细瞧一瞧,嘿!一堆环境变数与系统资源方面的变数, 可是会影响到我们在 bash 里头是否能够顺利作业的呢!例如 PATH 啊、ulimit 之类的~ 所以,您还是得要了解变数这个玩意才行喔! ^_^

使用最多的就是下面两个

var=${str-expr}:只要有输入,就使用输入的值,哪怕输入为空字符串,否则使用expr的默认值

var=${str:-expr}:只有输入非空字符串时,才使用输入值,否则使用expr的默认值