上面所有这些语法规则中,如果去掉:,则只测试存在性,不测试空值
取字符串切片、字符串长度
功能介绍: 由指定的位置开始,截取子字符串到字符串结束。
语法规则: ${变量:位置起点}
示例:
myname="Sheller man"
substr=${myname:4}
echo $substr //ler man
功能介绍:由指定的位置开始,截取指定长度的子字符串。
语法规则: ${变量:位置起点:长度}
示例:
echo "_${IFS:0:1}_"
echo "_${IFS:1:1}_"
echo "_${IFS:2:1}_"
IFS是分隔字符变量,是由"空格符"、"TAB(\t)"、"换行字符(\n)"组成
位置参数
命令行第一个参数用$1表示,第二个用$2表示,其他依此类推。$@则代表所有的参数。例如:substr.sh x y z这道指令中,第一个参数就是x,第二个是y,第三个是z。$1的值即为x;$2的值为y;$3的值为z。命令本身用$0表示,其值为substr.sh.
取得部分位置参数的用法如下:${@:起点} ${@:起点:个数}
功能介绍:字符串长度
语法规则:
(1) ${#变量名称}
(2) expr length "字符串"
(3) expr "字符串" : '.*'
示例:
(1)filename="/usr/sbin/ntpdate"
echo ${#filename}
(2)str='Here you are.'
len=$(expr length "$str")
(3)str='Here you are.'
len=$(expr "$str" : '.*')
取得数组的长度:${#数组[@]} 或${#数组[*]}
删除子字符串
功能介绍:由字符串前面对比,删除相符者(前面对比,删最短的)
语法规则:${变量#样式}
示例:
(1) filename="/usr/sbin/ntpdate"
r=${filename#/*/}
echo $r
解释:样式/*/的意思是指:凡一对斜线之间有字符者(空字符串亦可),对比符合,因此输出 sbin/ntpdate
功能介绍:由前面对比、删最长的相符者
语法规则: ${变量##样式}
示例:
(2) filename="/usr/sbin/ntpdate"
r=${filename##/*/}
echo $r //输出ntpdate
功能介绍:由后面对比,删除最短的相符者
语法规则:${变量%样式}
示例:
(3) filename="/usr/sbin/ntpdate"
r=${filename%/*}
echo $r //输出/usr/sbin
功能介绍:由后面对比,删除最长的
语法:${变量%%样式}
示例:
(4) fqdn="www.tnc.edu.cn"
m=${fqdn%%.*}
echo $m //输出www
替换子字符串
功能介绍:只替换第一个对比符合的字符串
语法规则: ${变量/样式/替换字符串}
示例:
(5) act="mail:x:8:8:mail:/var/mail:/bin/sh"
r=${act/:/,}
echo $r //mail,x:8:8:mail:/var/mail:/bin/sh
功能介绍:替换全部对比符合的字符串
语法规则:${变量//样式/替换字符串}
示例:
(6) act="mail:x:8:8:mail:/var/mail:/bin/sh"
r=${act//:/,}
echo $r //mail,x,8,8,mail,/var/mail,/bin/sh
功能介绍:删除第一个符合样式的字符串
语法规则:${变量/样式/}
功能介绍:删除所有符合样式的字符串
语法规则:${变量//样式/}
功能介绍:要求替换的样式在句首或句尾,在对比样式时,若在样式前加上#,如#T,则该样式要出现在变量值的开头才算符合。(%对应句尾)
示例:
(7) str="Yes, This is a TITLE."
r=${str/#T* /}
echo $r
解释:此处对比的是位置在句首,T字符后接任意长度的字符,最后以空格结尾的字符串,因$str中无此样式,所以整个str变量值原封不动地返回给r。
如果把样式修改成${str/T* /},表示样式不一定要位于句首,那么,在$str中就有符合的样式了,删除后,值变为Yes, TITLE.
命令替换
所谓命令替换,是把命令执行后的标准输出放入变量中。
示例:
(1) DIRS=$(ls)
for f in $DIRS
do
echo $f
done
(2) file="/etc/passwd"
IFS=' '
fc=$(cat $file)
echo $fc
分隔字符变量IFS的内容,改用空格符.(IFS的内容原为:空格符、\t和\n).取得/etc/passwd的文件内容。由于IFS改为空格符,所以,变量扩展时,换行字符不会被删除,这样才能保持该文件的内容。
如果不改设IFS,则passwd的每行会去掉换行字符,变成一个以空格符隔开各行的字符串。fc=$(cat $file)改为fc=$(<$file)的效果是一样的,这是使用转向输入取得文件内容,再扩展成变量内容放入fc中。
(3) PDIR=$(cd ..; pwd)
(4) r=$(du -s $(pwd))