【发布时间】:2020-09-09 01:45:15
【问题描述】:
使用 bash,检查变量是否为空的最佳方法是什么?
如果我使用:
if [ -z "$VAR" ]
正如论坛中所建议的,这适用于未设置的变量,但当变量已设置但为空时,它是正确的。 有什么建议吗?
【问题讨论】:
标签: bash
使用 bash,检查变量是否为空的最佳方法是什么?
如果我使用:
if [ -z "$VAR" ]
正如论坛中所建议的,这适用于未设置的变量,但当变量已设置但为空时,它是正确的。 有什么建议吗?
【问题讨论】:
标签: bash
${var+set} 如果未设置变量,则不替换任何内容;如果将其设置为包括空字符串在内的任何内容,则 set 不替换。仅当变量设置为非空字符串时,${var:+set} 才会替换 set。您可以使用它来测试任何一种情况:
if [ "${foo+set}" = set ]; then
# set, but may be empty
fi
if [ "${foo:+set}" = set ]; then
# set and nonempty
fi
if [ "${foo-unset}" = unset ]; then
# foo not set or foo contains the actual string 'unset'
# to avoid a potential false condition in the latter case,
# use [ "${foo+set}" != set ] instead
fi
if [ "${foo:-unset}" = unset ]; then
# foo not set or foo empty or foo contains the actual string 'unset'
fi
【讨论】:
- 以相反的方式工作,即如果 foo 未设置,${foo-unset} 会产生“未设置”。这对于空运行脚本很有用,例如rsync -avuz ${DRYRUN---dry-run} $HOME/blog/ webserver:blog/ 必须以 DRYRUN= upblog.sh 运行才能实际执行上传。
你可以用
测试[ -v name ]
名称没有$ 符号
【讨论】:
-v,所以使用[[ ... ]] 而不是[...]。
未设置(不存在)的变量和空变量在参数扩展中表现不同:
在以下示例中:
没有冒号:
仅检查变量是否存在。
带冒号:
检查变量是否存在,如果存在,请确保它不存在 空的。
换句话说,检查变量是否存在和非空性。
${parameter:-word}
如果参数为unset 或null,则替换单词的扩展。否则,参数的值被替换。
${parameter-word}
如果参数是未设置...
${parameter:=word}
如果 parameter 为 unset 或 null,则将 word 的扩展分配给 parameter。然后替换参数的值。位置参数和特殊参数不能这样赋值。
${parameter=word}
如果参数是未设置...
${parameter:?word}
如果参数是 unset 或 null,则 word 的扩展(或如果 word 不存在,则将显示该效果的消息)写入标准错误和 shell,如果它不是交互式的,退出。否则,参数的值被替换。
${parameter?word}
如果参数是未设置...
${parameter:+word}
如果参数为unset 或null,则不替换,否则替换单词的扩展。
${parameter+word}
如果参数是未设置...
【讨论】:
好吧,这是一种方法
$ s=""
$ declare -p s
declare -- s=""
$ unset s
$ declare -p s
bash: declare: s: not found
如果未设置变量,则会出现错误消息。
【讨论】:
declare -- s="" 不是空字符串,因此在这种情况下它不会“返回空白”;无论如何,您只需检查退出状态:if declare -p s &>/dev/null; then echo "Variable s is set"; else echo "Variable s is unset"; fi。我不赞成这一点,因为有更好的选择(更便携,更易于阅读);但它确实工作。
if [ `set | grep '^VAR=$'` ]
这会在变量集列表中搜索字符串“VAR=”。
【讨论】:
if statement does.
if set | grep -q '^VAR=$'; then ...
这仅适用于空,而不是未设置(或具有值)
[ -z ${VAR-X}
【讨论】:
](或从 [ 到 test 的更改)周围加上引号才能正常运行。