参数扩展:
1.被名称引用的参数称作变量
2.被数字引用的参数称作位置参数
3.被特定符号引用的参数具有特殊的含义和用途,被称作Bash的特殊内部变量引用。
基本参数扩展:
字符$会引导参数扩展。大括号是可选的,但是大括号可以保护待扩展的变量,使得紧跟大括号后面的内容不会被扩展。
例:
$ PARAMETER
$ {PARAMETER}
#如果参数名后跟其他字符,大括号是必须的。 $ WORD=car
$ echo $WORDs
$ echo ${WORD}s
cars
对于$9后面的参数也是要用大括号的。
注意:参数名是大小写敏感的。
间接参数扩展:
$ PARAMETER=TEMP
$ TEMP="It's indirect"
$ echo $PARAMETER
TEMP
$ echo ${!PARAMETER}
it's indirec
大小写修改(Bash4.0):
$ echo ${PARAMETER^}
#将参数的第一个字符改为大写
$ echo ${PARAMETER^^}
#将参数的全部字符改为大写
$ echo ${PARAMETER,}
#将参数的第一个字符改为小写
$ echo ${PARAMETER,,}
#将参数的全部字符改为小写
$ echo ${PARANETER~}
#将参数的第一个字符改为大写
$ echo ${PARANETER~~}
#将参数的全部字符改为大写
大小写修改实例:
# for file in *.txt
>do
>mv "$file" "${file,,}"
>done
变量名扩展:
${!PREFIX*}
${!PREFIX@}
#列出以字符串PREFI开头的所有变量名
例:列出以BASH开头的所有变量名
$echo ${!BASH*}
BASH BASHOPTS BASHPID BASH_ALIASES BASH_ARGC BASH_ARGV BASH_CMDS BASH_COMMAND BASH_LINENO BASH_SOURCE BASH_SUBSHELL BASH_VERSINFO BASH_VERSION
字符串移除:
${PARAMETER#PATTERN}
${PARAMETER##PATTERN}
#移除从参数值的开头匹配指定模式的字符串
${PARAMETER%PATTERN}
${PARAMETER%%PATTERN}
#移除从参数值的结尾匹配指定模式的字符串
#”#“和”%“表示移除匹配指定模式的最短文本,”##“和”%%“表示移除匹配模式的最长文本。
字符串移除实例:
$ MYSTRING="This is used for removing string"
$ echo ${MYSTRING#* }
is used for removing string $echo ${MYSTRING##* }
string $echo ${MYSTRING% *}
This is used for removing $echo ${MYSTRING%% *}
This
参数用途,提取文件名的一部分:
$ FILENAME=linux_bash.txt $ echo ${FILENAME%.*} #移除文件名的后缀
linux_bash $ echo ${FILENAME##*.} #移除文件名,保留后缀
txt FILENAME=/home/book/linux_bash.txt $ echo ${FILENAME%/*} #移除文件名,保留目录名
/home/book $ echo ${FILENAME##*/} #移除目录名,保留文件名
linux_bash.txt
字符串的搜索与替换:
$ {PARAMETER/PATTERN/STRING}
$ {PARAMETER//PATTERN/STRING}
$ {PARAMETER/PATTERN}
$ {PARAMETER//PATTERN}
#操作符“/”和“//”分别表示只替换一个匹配的字符串和替换全部匹配的字符串,如果没有指定替换的字符串STRING,那即是替换为空,即删除。
例:
$ MYSTRING="This is used for replacing string or removing string"
$ echo ${MYSTRING/string/characters}
This is used for replacing characters or removing string $ echo ${MYSTRING//string/characters}
This is used for replacing characters or removing characters $ echo ${MYSTRING/string }
This is used for replacing or removing string $ echo ${MYSTRING//string }
This is used for replacing or removing string $ echo ${MYSTRING//string/ }
This is used for replacing or removing
求字符串的长度:
$ echo ${#PARAMETER}
得到参数值的长度:
$ MYSTRING="Hello World"
$ echo ${#MYSTRING}
子字符串扩展:
$ {PARAMETER:OFFSET
$ {PARAMETER:OFFSET:LENGTH}
从指定的位置开始截取指定长度的字符串;如果不指定截取的字符串长度,将会截取至末尾。
不指定长度:
$ MYSTRING="This is used for substring expansion." $ echo ${MYSTRING:}
used for substring expansion.
指定长度:
$ echo ${MYSTRING::}
used for s
使用默认值:
${PARAMTER:-WORD}
${PARAMTER-WORD}
如果参数PARAMTER未定义或者为NULL时,这种模式或扩展WORD,否则会扩展参数PARAMTER;如果在PARAMTER和WORD之间未使用”:“时,只有参数PARAMTER未定义时,才会使用WORD。
$ unset MYSTRING $ echo $MYSTRING $ echo ${MYSTRING:-Hello World}
Hello World
$ echo MYSTRING $ MYSTRING=HI
$ echo ${MYSTRING}:-Hello World
HI
指定默认值:
${PARAMETER:=WORD}
${PARAMETER=WORD}
此种模式和使用默认值的区别在于,不仅扩展WORD,还将WORD的值赋值给参数PARAMTER,作为PARAMTER的值。
例:
$ unset MYSTRING
$ echo $MYSTRING $ echo ${MYSTRING:=Hello World}
Hello World $ echo $MYSTRING
Hello World
使用替代值:
${PARAMTER:+WORD}
${PARAMTER+WORD}
#如果参数PARAMTER是未定义的,或者其值未空时,这种模式将不扩展任何参数。如果参数PARAMTER是定义的,且其值不为空,这种模式会扩展WORD,而不是扩展PARAMTER的值。
$ MYSTRING="" $ echo ${MYSTRING:+MOTE:MYSTRING seems to be set.} $ MYSTRING="HI"
echo ${MYSTRING:+NOTE:MYSTRING seems to be set.}
NOTE:MYSTRING seems to be set