Shell 的变数功能--额外的变数设定功能
时间:2009-01-16 来源:poplar.xu
额外的变数设定功能
刚刚我们提到了两种变数取用的方法,分别是这样:
[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= 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 这个变数内容存在,则 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 与 str 相同
[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 之类的~ 所以,您还是得要瞭解变数这个玩意才行喔! ^_^
(评论:本节内容的意思是在写出变量的同时修改变量的内容。变量由变量名和变量内容两部分,本节的意思就是在写出变量名的同时修改变量的内容,所以交变量设定。)
刚刚我们提到了两种变数取用的方法,分别是这样:
[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= 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 这个变数内容存在,则 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 与 str 相同
[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 之类的~ 所以,您还是得要瞭解变数这个玩意才行喔! ^_^
(评论:本节内容的意思是在写出变量的同时修改变量的内容。变量由变量名和变量内容两部分,本节的意思就是在写出变量名的同时修改变量的内容,所以交变量设定。)
相关阅读 更多 +