高级变量,有3个主题:
(1)变量扩展 ${变量名称} $(filename)
(2)命令替换 ${命令} $(ls /)
(3)算术扩展 $((算术式)) $((9+9))
1. 测试变量“存在于否”的基本用法
语法:${待测变量-默认值}
用例:
unset myname
r=${myname-'basher'}
echo $r
结果为:basher
2. 测试变量“不存在”或其值为空:“传回”一个默认值
语法:${待测变量:-默认值}
用例:
myname=
r=${myname:-'basher'}
echo $r
结果为:basher
特殊运用法
[ -n ${DEBUG:-} ] && set -v
[ ]是测试条件的语法,其中-n是用来测试后接的变量是否有值,若非空,则传回真值。
${DEBUG:-}就是-n要测试的对象。:-后面原本放置默认值的地方却没有任何东西,表示故意要让默认值为空。
3.测试变量“不存在”或其值为空:给变量设一个默认值
语法:${待测变量:=默认值}
用例:
unset count
r=${count:=100}
echo $count
结果为:100
用例2:
count=500
r=${count:=100}
echo $r
结果为:500
目的:给变量设一个默认值
4.测试变量是否“不存在”或其值为空:提示错误信息
语法:${待测变量:?提示信息}
5.测试变量的“存在性”
语法:${待测变量:+真值}
用例:
Iamhappy='feel so good'
r=${Iamhappy:+'true'}
echo $r
结果为:true
目的:用来测试某件事是真的。
6.变量的扩展:取字符串切片,字符串长度
(1)取字符串切片
语法一:${变量:位置起点}
用例:
myname="sheller name"
substr=${myname:4}
结果为:ler name
语法二:${变量:位置起点:长度}
用例:
filename="/etc/apache2"
dir1=${filename:1:3}
echo $dir1
结果为etc
7.计算字符串长度
语法:${#变量名称}
用例:
filename="/usr/sbin/ntpdate"
echo ${#filename}
结果为:17
8.变量扩展:对比样式
由字符串前面对比,删除相符者
语法:${变量#样式}
用例1:
filename="/usr/sbin/ntpdate"
r=${filename#/*/}
echo $r
结果为:sbin/ntpdate
用例2:
filename="//usr/sbin/ntpdate"
r=${filename#/*/}
echo $r
结果为:usr/sbin/ntpdate
由前面对比,删最长的
语法:${变量##样式}
用例:
filename="/usr/sbin/ntpdate"
r=${filename##/*/}
echo $r
结果为:ntpdate
由后面对比,删最短的
语法:${变量%样式}
用例:
filename="/usr/sbin/ntpdate"
r=${filename%/*}
echo $r
结果为 /usr/sbin
由后面对比,删最长的
语法:${变量%%样式}
用例:
fqdn="www.tnc.edu.cn"
m=${fqdn%%.*}
echo $m
结果为www
总结:#经常放在数字前面表示个数,就记住它是由前面对比。一个#删最短,两个#删最长。
%经常放在数字后面代表百分比,所以看到它,就记着它是由后面对比。一个%删最短,两个%%删最长。
9. 只替换第一个对比符合的字符串
语法:${变量/样式/替换字符串}
用例:把:换成,
act="mail:x:8:8:mail:/var/mail"
r=${act/:/,}
echo $r
结果为:mail,x:8:8:mail:/var/mail
10. 替换全部对比符合的字符串
语法:${变量//样式/替换字符串}
把;换成,
act="mail:x:8:8:mail:/var/mail"
r=${act//:/,}
echo r$
结果为:mail,x,8,8,mai,/var/mail
11. 把对比符合的字符串删除
只删一个
语法:${变量/样式/}
用例:把第一个:删除
act="mail:x:x:8:8:mail:/var/mail"
r=${act/:/}
echo r$
结果为:mailx:x:8:8:mail:/var/mail
删除全部
语法:${变量//样式/}
把所有的:删除
用例:
act="mail:x:8:8:mail:/var/mail"
r=${act//:/}
echo r$
结果为:mailx88mail/var/mail
12.变量扩展:取变量名称列表、数组索引列表
取变量名称列表
语法:${!开头字符串@}或${!开头字符串*}
用例:
filename="ntpdate"
dir="/usr/sbin"
dir_file="$dir/$filename"
echo ${!di@}
结果为:dir dir_file
取数组索引列表
语法:${!数组变量[@]}或{!数组变量[*]}
用例:
ar=(a b c xy z)
r=${!ar[@]}
echo r$
结果为:0 1 2 3 4
用例:
ar=(a b c xy z)
for i in "${!ar[@]}"
do
echo "index $i: ${ar[$i]}"
执行结果为:index 0: a
index 1: b
................
13.命令替换
命令替换的语法是:变量名称=$(命令)
用例:
DIRS=$(ls)
for f in $DIRS
do
echo $f
done
$DIRS里的文件名,轮替放入$f,然后由行4显示出来
14.算术扩展
算术扩展的语法:$((算术式))
用例:
I=$((8+16))
echo $I
结果显示为:24