月度归档:2017年04月

Bash Parameter Expansion

今天重新温故了一遍shell
Bash Reference Manual
在阅读Parameter Expansion部分发现了新大陆.

${parameter:-word}
如果parameter为空或者未定义,值替换为word;否则为parameter的值.

#var1=""  var2="world"
#echo ${var1:-hello} ${var2:-guest}
hello world

${parameter:=word}
如果parameter为空或者未定义,word赋值给parameter;否则为parameter的值.

#var1=""  var2="world"
#echo ${var1:=hello} ${var2:=guest}
hello world
#echo ${var1} ${var2}
hello world

${parameter:?word}
如果parameter为空或者未定义,word作为标准错误输出,并且如果shell非交互式,退出shell;否则为parameter的值.

#echo ${var:?这个变量存在吗?}
-bash: var: 这个变量存在吗?

${parameter:+word}
如果parameter为空或者未定义,值为空;否则为word的值.(和${parameter:-word}相反)

#var1=""  var2="world"
#echo ${var1:+hello} ${var2:+guest}
guest

${parameter:offset}
${parameter:offset:length}
这是子字符串的扩展;
如果parameter是一个变量,
值为参数(从左到右)第offset的开始保留length个字符;
如果没有指定length,值为参数(从左到右)第offset的开始的字符;
如果offset小于0,则从尾部开始(offset为负数时,一定要加空格);
如果length小于0,则表示为从尾部开始的偏移量.
如果parameter是一个数组(带下标@或者*),
数组成员作为一个元素偏移,length必须大于0.

*strings为变量
#strings=goodluck
#echo ${strings:4:4}
luck
#echo ${strings: -6:2}
od
#echo ${strings: -6:-1}
odluc
*strings为数组,length必须大于0
#strings=(this is a arrays)
#echo ${strings[@]:2:1}
a
#echo ${strings[@]: -1:1}
arrays
#echo ${strings[@]: -1: -1}
-bash:  -1: substring expression < 0

${!prefix*}
${!prefix@}
列出所有开头为prefix的变量名,以IFS的第一个字符作为分隔符.
如果使用”@“,并且在双引号内,则每个变量名为一个单独的单词.

#declare websit=blog.weskiller.com wad= wait=3
#echo ${!w@}
wad wait websit
#echo ${!wa*}
wad wait
#for i in "${!wa@}";do echo $i;done
wad
wait
#for i in "${!wa*}";do echo $i;done
wad wait

${!name[@]}
${!name[*]}
如果name是一个数组变量,列出数组下标或者数组键值(如果是键值数组),
如果使用”@“,并且在双引号内,则每个键值或者下标为一个单独的单词.;
如果name是一个变量,则值为0;
如果name不是一个数组或者变量,值为空.

#declare -A arrays=([a]=1 [b]=2 =3 [d]=4)
#echo ${!arrays[@]}
a b c d
#unset arrays
#declare -a arrays=(1 2 3 4 5)
#echo ${!arrays[*]}
0 1 2 3 4
#unset arrays
#decalire arrays=this
#echo ${!arrays[@]}
0

${#parameter}
值为parameter字符的长度;
如果parameter是一个数组(带下标@或者*),则值表示数组包含元素的个数.

#strings=abcd
#echo ${#strings}
4
#strings=(a b c d e)
#echo ${#strings[*]}
5

${parameter#word}
${parameter##word}
*“表示为通配符,表示任意字符任意长度,
?“表示为通配符,表示一个任意字符,
[..]“表示匹配[]内包含的单个字符.
详细资料请移步查看手册Filename-Expansion
word作为文件名扩展模式,从parameter的值头部开始匹配,删除匹配最短的部分(#),或者删除最长匹配的部分(##).
如果parameter是一个数组(带下标@或者*),
则对每个元素进行匹配,结果为删除后的值.

#strings="hello world"
#echo ${strings#h*l}
lo world
echo ${strings##h*l}
d


${parameter%word}
${parameter%%word}
${parameter#word},${parameter##word}相同,但是从尾部开始匹配.

#strings="hello world"
# echo ${strings%l*d}
hello wor
# echo ${strings%%l*d}
he

${parameter/pattern/string}
pattern匹配parameter的值,替换为string,/替换第一次匹配,
如果pattern开头为/,则替换所有匹配;
pattern作为文件名扩展模式.

#strings=abcdea
#echo ${strings/a/0}
0bcdea
#echo ${strings//a/0}
0bcde0

${parameter^pattern}
${parameter^^pattern}
改变parameter的值,转换小写字母为大写,第一个字符为大写(^),或者全部转换为大写(^^).

#shell=bash
#echo ${shell^}
Bash
#echo ${shell^^}
BASH

${parameter,pattern}
${parameter,,pattern}
改变parameter的值,转换大写字母为小写,第一个字符为小写(,),或者全部转换为小写(,,).

#shell=BASH
#echo ${shell,}
bASH
#echo ${shell,,}
bash

陆续更新