1、处理或/并扩展变量
1) p a r a m e t e r 和 {parameter} 和 parameter和parameter是相同的,都是表示变量parameter的值。在一些环境中,使用${parameter}比较不会引起误解.
可以把变量和字符串连接.
your_id=${USER}-on-${HOSTNAME}
echo "$your_id"
echo "Old \$PATH = $PATH"
PATH=${PATH}:/opt/bin # 在脚本的生存期内,能额外增加路径/opt/bin到环境变量$PATH中去.
echo "New \$PATH = $PATH"
2)${parameter-default}, ${parameter:-default}
如果变量没有被设置,使用默认值。
#!/bin/bash
# parameter-default.sh
echo ${username-`whoami`} # 没有设置则使用默认值
username=
echo ${username-`whoami`} # 设置了则使用username,即使设置的值为null
username=jusine
echo ${username-`whoami`}
p a r a m e t e r − d e f a u l t 和 {parameter-default}和 parameter−default和{parameter:-default}几乎是相等的。它们之间的差别是:当一个参数已被声明,但是值是NULL的时候两者不同.
#!/bin/bash
# param-sub.sh
# 变量是否被声明
#+ 即使它的值是空的(null)
#+ 也会影响是否使用默认值.
username0=
echo "username0 has been declared,but is set to null."
echo "username0 = ${username0-`whoami`}"
# 声明了,即使为null,不使用默认值,没有输出
echo
username2=
echo "username2 has been declared,but is set to null."
echo "username2 = ${username2:-`whoami`}"
# 声明了,但是为null的时候会使用默认值
echo
echo username3 has not been declared.
echo "username3 = ${username3-`whoami`}"
# 未声明,输出默认值
echo
echo "username3 = ${username3:-`whoami`}"
# 未声明,输出默认值
echo
variable=
# 变量已声明,但被设置了空值(null).
echo "${variable-0}" # (没有输出)
echo "${variable:-1}" # 1
unset variable
# 未声明则都使用默认值
echo "${variable-2}" #2
echo "${variable:-3}" #3
exit 0
默认值结构可以在脚本中提供一个没有传递命令行参数时的默认值.
#!/bin/bash
# default_filename.sh
DEFAULT_FILENAME=generic.data
filename=${1:-$DEFAULT_FILENAME}
# 如果执行这个文件时,没有传递参数值,则会使用DEFAULT_FILENAME
echo $filename
3)${parameter=default}, p a r a m e t e r : = d e f a u l t 如果变量 p a r a m e t e r 没有设置,把它设置成默认值 . 两种形式几乎相同,只是和上面的一样:只有当 {parameter:=default} 如果变量parameter没有设置,把它设置成默认值. 两种形式几乎相同,只是和上面的一样:只有当 parameter:=default如果变量parameter没有设置,把它设置成默认值.两种形式几乎相同,只是和上面的一样:只有当parameter变量被声明且被设置成null值时不同.
#!/bin/bash
echo ${username=`whoami`}
echo ${username:=`whoami`}
# username未声明,则使用默认值
username=
echo ${username=`whoami`}
# username声明,但为null,不使用默认值
echo ${username:=`whoami`}
# username声明,但为null,使用默认值
username=jusine
echo ${username=`whoami`}
echo ${username:=`whoami`}
4)${parameter+alt_value}, ${parameter:+alt_value}
如果变量parameter设置,使用alt_value作为新值,否则使用空字符串。
除了引起的当变量被声明且值是空值时有些不同外,两种形式几乎相等。请看下面的例子.
#!/bin/bash
# para-add.sh
a=${param1+xyz}
echo "a = $a" # a =
param2=
a=${param2+xyz}
echo "a = $a" # a = xyz
param3=123
a=${param3+xyz}
echo "a = $a" # a = xyz
a=${param4:+xyz}
echo "a = $a" # a =
param5=
a=${param5:+xyz}
echo "a = $a" # a =
param6=123
a=${param6+xyz}
echo "a = $a" # a = xyz
5)${parameter?err_msg}, ${parameter:?err_msg}
如果变量parameter已经设置,则使用该值,否则打印err_msg错误信息。
这两种形式几乎相同,仅有和上面所说的一点不同:带有:使当变量已声明但值是空值时不同.
#!/bin/bash
# parameter-msg.sh
# 检查一些系统环境变量
# 这是很好的预防性防护
# 例如,如果$USER(用户在控制台的名字)没有被设置
#+ 系统将不接受你
: ${HOSTNAME?} ${USER?} ${HOME?} ${MAIL?}
# 如果以上任意一个变量没有被设置,都会输出错误消息并退出
echo
echo "Name of the machine is $HOSTNAME."
echo "You are $USER."
echo "Your home directory is $HOME."
echo "Your mail INBOX is located in $MAIL."
echo
echo "If you are reading this message,"
echo "critical environmental variables have been set."
echo
echo
# ----------------------------------------------------
# ${variablename?}结构也能检查一个脚本中变量的设置情况
#
ThisVariable=Value-of-ThisVariable
# 注意,顺便说一下字符串变量可能被设置成不允许的字符
#
: ${ThisVariable?}
echo "Value of ThisVariable is $ThisVariable."
echo
echo
: ${ZZXy23AB?"ZZXy23AB has not been set."}
# 如果变量ZZXy23AB没有被设置
#+ 则脚本会打印一个错误信息而结束
# 你可以指定错误信息
# : ${variablename?"ERROR MESSAGE"}
# 等同于: dummy_variable=${ZZXy23AB?}
# dummy_variable=${ZZXy23AB?"ZXy23AB has not been set."}
#
# echo ${ZZXy23AB?} > /dev/null
#
# 使用命令"set -u"后,再比较这些检查变量是否被设置的方法的不同...
#
echo "You will not see this message,because script already terminated."
HERE=0
exit $HERE # 不会执行到这儿
# 实际上,这个脚本会返回退出状态码1(echo $?).
![在这里插入图片描述](https://img-blog.csdnimg.cn/b077363f91bb48dcb1d7e21835321794.png
#!/bin/bash
# parameter-usage.sh
: ${1?"Usage: $0 ARGUMENT"}
# 如果没有提供命令行参数则脚本在这就退出了,
#+ 并打印了错误信息.
# parameter-usage.sh:1:Usage: parameter-usage.sh ARGUMENT
echo "These two lines echo only if command-line parameter given."
echo "command line parameter =\"$1\""
exit 0 # 仅在命令行参数提供时,才会在这儿退出
# 分别检查有命令行参数和没有命令行参数时的退出状态。
# 如果有命令行参数,则"$?"为0.
# 否则,"$?"为1.