在bashshell中$符号会触发3种扩展,包括变量扩展,命令替换及算术扩展。其中变量扩展内容最为丰富,本节我们就来具体介绍一下$是如何实现变量扩展的。
变量扩展的基本格式是${}.
1. 变量扩展:测试存在性及空值
a.测试变量“存在与否与是否为空”的基本语法
${待测变量:-默认值}
意义为:若待测变量不存在或为空值,那么返回一默认值,否则返回待测变量的值。
${待测变量:=默认值}
意义为:若待测变量不存在或空值时,给变量赋值为默认值,否则待测变量值维持原状。
这里要注意区别返回值与赋值的区别。若变量不存在或为空时,返回值后变量仍为空或不存在,所以这里一般会使用“变量名称=${待测变量:-默认值}”形式;但赋值后变量便有了值。
${待测变量:?提示信息}
意义为:若待测变量值为空或不存在时,返回变量名称+提示信息,并立即中断shell脚本的运行,用来防止变量值为空时会对以后的程序运行造成伤害。
b.测试变量的存在性
${待测变量:+真值}
意义为:若变量存在且其值非空时,传回“真值”;若不然,传回空值。
2.变量扩展:取字符串切片、字符串长度
a.取字符串切片
字符串的第一个字符,编号为0,依次增加1
取字符串切片有两个主要的语法:
语法1:${变量:位置起点}
意义为:由指定的位置开始,截取字符串到字符串结束
语法2:${变量:位置起点:长度}
意义为:由指定的位置开始,截取长度为“长度”的子字符串
例如:利用shell程序判断分割字符变量IFS内容包括“空格”,“TAB”及“换行字符”
解: echo "_${IFS:0:1}_"
echo "_${IFS:1:1}_"
echo "_${IFS:2:1}_"
输除分别为“空格”,“tab个空格”“换行”
这里之所以用_是因为这些输出都是空白的,用_ _夹住用来查看输出的正确与否。
b.计算字符串长度
语法为:${#变量} :个人这个超级好用,也很简单,关键是要牢记
3.变量扩展: 对比样式
a.由字符串前面对比,删除相符者
语法一:${变量#样式}
意义为:从变量前面开始对比,删除与样式相符的最短者
例如:
filename="/usr/sbin/ntpdate"
r=${filename#/*/}
echo $r
输出为:sbin/ntpdate
语法二:${变量##样式}
意义为:由字符串前面对比,删除与样式相符的最长者
例:
r=${filename##/*/}
echo $r
输出为ntpdate
这一命令等同于basename{filename}
b、由字符串后面对比,删除相符者
同样存在两种语法
语法1.${变量%样式}
意义为:由字符串后面开始对比,删除最短相符者
语法2.${变量%%样式}
意义为:由字符串后面开始对比,删除最长相符者
c.取代或删除部分字符串
替换第一个符合样式的字符串
语法:${变量/样式/替换字符串}
替换全部符合样式的字符串
语法:${变量//样式/替换字符串}
例如:
act="mail:x:8:8"
r1=${act/:/,} 输出为:mail,x:8:8
r2=${act//:/,} 输出为:mail,x,8,8
若替换字符串为空,则代表把符合样式的删掉
4变量扩展:取变量名称列表、数组及索引列表
a.取变量名称列表
语法为:${!开头字符串@}或${!开头字符串*}
意义为:把所有以指定字符串开头的变量名称列出,各变量之间,用$IFS定义的第一个分隔符隔开。
例:
filename="ntpdate"
dir="/usr/sbin"
dir_file="$dir/$filename"
echo ${!dir@}
输出为:dir dir_file
注意这里取的是变量名称的列表,而不是取的变量值
b.取数组索引列表
语法为:${!数组变量[@]}或${!数组变量[*]}
例如:
ar={a b c}
r=${!ar[@]}
输出为0 1 2
转载自:http://wbwk2005.blog.51cto.com/2215231/441680
阅读(2083) | 评论(0) | 转发(0) |