HOWTO · Bash
如何检查 Bash 变量是否为空
了解在 Bash 中测试变量是否为空字符串的四种方法,包括安全的引用方式,以及未设置的值和仅含空白字符的值的表现。
本页内容
对于提供的 Bash 值,请引用其展开形式,以便 shell 将它作为一个参数传递。此脚本会打印一个带标签的值:
value='Bash'
if [ -z "$value" ]; then
printf '%s\n' 'No value supplied'
else
printf 'Value: %s\n' "$value"
fi
Value: Bash
当展开后的字符串为零个字符时,test 命令(也写作 [ ... ])返回成功。在普通的 Bash shell 中,未设置的变量会展开为空字符串,因此 -z 会同样对待未设置的值和显式为空的值。使用 set -u 时,请使用 ${value-} 在测试前提供一个默认值。像 0 这样的值或由空格组成的字符串并不为空;该测试检查的是字符,而不是一个词看起来是否为真。
使用 -z 检查 Bash 变量是否为空
当展开后的字符串为零个字符时,test 命令(也写作 [ ... ])返回成功状态。非零状态意味着它至少包含一个字符。测试本身不会打印消息;if 语句会选择要运行哪个命令。
value=''
if [ -z "$value" ]; then
printf '%s\n' 'value is empty'
else
printf '%s\n' 'value is not empty'
fi
value is empty
对于未设置的变量,在通常的 shell 配置下,同样带引用的检查会成功。使用 set -u 时,请改为写 [ -z "${value-}" ],以便展开保持已定义。括号命令是一个 shell 命令,其成功或失败由其退出状态表示;它不会自动打印 true 或 false。
使用 -n 检查 Bash 变量是否非空
使用 -n 进行互补的测试:当展开后的字符串至少包含一个字符时,它返回成功。then 分支会针对非空值运行,而当测试失败时(包括值为空时)会运行 else。
value='Bash'
if [ -n "$value" ]; then
printf '%s\n' 'value is not empty'
else
printf '%s\n' 'value is empty'
fi
value is not empty
引用很重要,因为它能将展开保留为一个参数。与 -z 一样,如果脚本可能使用 set -u 运行且变量可能未设置,请在引号内使用 ${value-}。当下一个操作只应在提供值之后才发生时,-n 选项尤其易于阅读。
将 Bash 变量与空字符串进行比较
您可以使用 Bash 的 [[ ... ]] 条件表达式将值直接与空字符串进行比较。带引用的展开使意图清晰,而包含空格的字符串仍然非空,因为这些空格是字符。
value=' '
if [[ "$value" == "" ]]; then
printf '%s\n' 'value is empty'
else
printf '%s\n' 'value is not empty'
fi
value is not empty
此示例走第二个分支:空格在 [[ ... ]] 内不会消失。对于使用 set -u 的脚本,请比较 ${value-},以便将未设置的变量视为空字符串处理。
使用 ${parameter:+word} 参数展开检查变量
当参数已设置且非 null 时,${parameter:+word} 形式会展开为 word。当参数未设置或包含空字符串时,它不会展开为任何内容。在引用展开的同时对其进行测试:
value='Bash'
if [ "${value:+present}" ]; then
printf '%s\n' 'value is set and nonempty'
else
printf '%s\n' 'value is unset or empty'
fi
value is set and nonempty
当您需要区分的是“已设置且非空”与“未设置或为空”时,这个惯用法很有用。它不会区分后两种状态。要区分未设置的参数与已设置但为空的参数,请将 Bash 的 [[ -v value ]] 检查用作单独的测试。