Bash Shell:查明变量是否已设置
如何在 BSD / Apple OS X / Unix / Linux 等操作系统下检查名为 $input 的 bash shell 变量是否已定义?当未设置 shell 变量(例如 $1)时,如何显示错误并退出?
Bash 带有参数扩展,如果参数为空或未设置,则会显示错误。因此,让我们在编写 bash 脚本时找出 shell 变量是否已设置并在屏幕上显示错误。
Bash 带有参数扩展,如果参数为空或未设置,则会显示错误。因此,让我们在编写 bash 脚本时找出 shell 变量是否已设置并在屏幕上显示错误。
教程详细信息 | |
---|---|
难度等级 | 简单的 |
Root 权限 | 不 |
要求 | Linux/Unix 上的 Bash |
预计阅读时间 | 3 分钟 |
当未设置 $1 等 shell 变量时显示错误并退出
语法是:
${parameter:?word} ${1:?Error message} ${var_name?:Error \$var_name not set. Bye}
让我们看一些例子。
方法 1:Bash 变量存在性检查
判断 $input 是否定义的语法如下:
${Variable?Error \$Variable is not defined}
或者
${Variable:?Error \$Variable is not defined}
Shell脚本示例:
#!/bin/bash set -e var="${1?:Error \$var_name not set. Bye}" echo "Now working on $var ..."
在此示例中,如果变量 $input 未定义,则脚本将停止执行:
input="Foo bar" echo ${input?Error \$input is not defined.} unset input echo ${input?Error \$input is not defined.}
示例输出:
Foo bar bash: input: Error $input is not defined.
在此示例中,确保 $input 已定义且不为空,输入:
[[ $input && ${input-x} ]] input="Foo" [[ $input && ${input-x} ]] && echo "Found" || echo "Not found" unset input [[ $input && ${input-x} ]] && echo "Found" || echo "Not found"
下面是一个确保 $_php_map_extension 已定义的示例:
# read config data loadConfigData "${_t_domain_php_conf}" $LINENO "${FUNCNAME[0]}" # make sure it is defined and not empty if [[ $_php_map_extension && ${_php_map_extension-_} ]] then at=${#_php_map_extension[*]} # get total elements in an array s="" echo '## Map extension to .php? ##' echo 'fastcgi.map-extensions = (' for (( i=0; i<${at}; i++ )); do [ $i -lt $(( $at - 1 )) ] && s="," || s="" # remove , for last item in an array echo " \".${_php_map_extension[i]}\" => \".php\"${s}" done echo ')' else echo "Skiping php map extension as \$_php_map_extension is not defined in /usr/local/etc/example/conf/php.conf." fi
示例输出:
Skiping php map extension as $_php_map_extension is not defined in /usr/local/etc/example/conf/php.conf
或者
## Map extension to .php? ## fastcgi.map-extensions = ( ".html" => ".php", ".htm" => ".php", ".phtml" => ".php", ".php3" => ".php", ".php4" => ".php" )
方法 #2:isvarset() 函数
上述示例对于完整性检查很有用。最后,您可以使用以下代码:
isvarset(){ local v="$1" [[ ! ${!v} && ${!v-unset} ]] && echo "Variable not found." || echo "Variable found." } # find out if $vech defined or not vech="Bus" && isvarset vech vech="" && isvarset vech unset vech && isvarset vech
方法 3:使用 STRING 的长度
test 命令的 -z 选项在 STRING 的长度为零时返回 TRUE。您可以使用以下语法:
### set or not??? input="Foo" [ -z "${input+x}" ] && echo "\$input is not set" || echo "\$input found and is set to \"$input\"." ### Not set at ALL unset input [ -z "${input+x}" ] && echo "\$input is not set" || echo "\$input found and is set to \"$input\"." ### 'set but empty' or not? input="" [ -z "$input" -a "${input+x}" = "x" ] && echo "\$input variable is set with empty value." || echo "\$input found and is set to \"$input\""
上述语法将告诉您变量在 bash shell 脚本中是否已定义、未定义或定义为空值。
总结
您学习了各种方法。有关更多信息,请使用 man 命令查看以下手册页:
man bash