unset myname r=${myname-'Basher'} echo $r
结果为Basher
测试存在与否
myname= r=${myname:-'Basher'} echo $r
结果为Basher
变量不存在或其值为空,传回默认值
unset conut r=${count:=100} echo $count 结果100
变量不存在或为空,赋一个默认值给变量
fn=${1:?'error!please remove the dir'} 没有传参,则打印错误信息
变量不存在或为空,打印提示信息
IamHappy='Feel so good' r=${IamHappy:+"$@"} echo $r 结果为所有传递的参数
变量存在,则返回一个值
myname="sheller man" substr=${myname:4} echo $substr
显示ler man
#vi test.bash
#!/bin/bash
echo $0
echo ${@:1}
#./test.bash aa bb cc dd
aa bb cc dd
将${@:1}改为${@:2}时,结果为:
bb cc dd
显示指定参数数字之后的参数
将${@:2}改为${@:2:2},结果为:
bb cc
显示指定参数数字之后的参数个数
截取字符串
filename="/usr/sbin/ntpdate" echo ${$filename}
结果:17
echo ${#数组[@]} 取得数组元素的个数
计算字符串长度
===========
TEST="/usr/bin/date" echo ${TEST#/*/} 由前面对比,删最短的,结果:bin/date
TEST="/usr/bin/date" echo ${TEST##/*/} 由前面对比,删最长的,结果:date
TEST="/usr/bin/date" echo ${TEST%/*} 由字符串后面对比,删除最短的,结果:/usr/bin
TEST="www.test.com.cn" echo ${TEST%%.*} 由后面对比,删最长的,结果:www
TEST="mail:x:8:8:mail:/var/mail:/bin/sh" R=${TEST/:/,} echo $R 只替换第一个对比符合的字符串,结果:mail,x:8:8:mail:/var/mail:/bin/sh
TEST="mail:x:8:8:mail:/var/mail:/bin/sh" R=${TEST//:/,} echo $R 替换全部对比符合的字符串,结果为:mail,x,8,8,mail,/var/mail,/bin/sh
TEST="mail:x:8:8:mail:/var/mail:/bin/sh" R=${TEST/:/} echo $R 删除第一个符合样式的字符串,结果:mailx:8:8:mail:/var/mail:/bin/sh
TEST="mail:x:8:8:mail:/var/mail:/bin/sh" R=${TEST//:/} echo $R 删除所有符合的,结果:mailx88mail/var/mail/bin/sh
str="yes, This is a TITLE." r=${str/#T* /} echo $r 行2要对比的是:位置在句首,T字符后接的任意长度的字符,最后以空格符结尾的字符串,因$str中无此样式,所以,整个str变量值原封不动的传回给r。 如果把行2样式改为${str/T* /},表示样式不一定要位于句首,那么就符合了条件,对比到的字符串是This is a,删除后,r的值为yes,TITLE。
==========
取得数组索引列表:
TEST=(a b c d e f) for i in "${!TEST[@]}" do echo "$i: ${TEST[$i]}" done 运行结果: 0: a 1: b 2: c 3: d 4: e 5: f
命令替换:
tmp=$(ifconfig eth0 | grep 'inet addr') r=${tmp/inet addr:/}#取出匹配字符之后的内容 ip=${r/ Bcast*/} #删除变量r中匹配字符内容 echo $ip 显示 ip地址
========
算数运算:
I=$((1+2)) echo $I
得到3,如果不加括号,则只能得到“1+2”
有多种方法实现:
$r=`expr 1+2`
$r=[1+2]
let $r=1+2