Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1366939
  • 博文数量: 245
  • 博客积分: 10021
  • 博客等级: 上将
  • 技术积分: 3094
  • 用 户 组: 普通用户
  • 注册时间: 2008-05-12 14:51
文章存档

2011年(2)

2009年(152)

2008年(91)

我的朋友

分类:

2009-01-16 11:50:34

额外的变数设定功能

刚刚我们提到了两种变数取用的方法,分别是这样:

[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 之类的~ 所以,您还是得要瞭解变数这个玩意才行喔! ^_^

(评论:本节内容的意思是在写出变量的同时修改变量的内容。变量由变量名和变量内容两部分,本节的意思就是在写出变量名的同时修改变量的内容,所以交变量设定。)

阅读(617) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~