【发布时间】:2018-08-13 16:54:39
【问题描述】:
我在 Fedora 27 下运行 Bash 4.4.19,我有一个简单的脚本:
#!/bin/bash
TESTENV="Hello"
echo "$TESTENV"
if [ -v $TESTENV ]; then
echo "Yup"
fi
echo "Done"
当我运行它时,它会打印:
Hello
./myscript: line 3: [: Hello: binary operator expected
Done
所以,我将额外的括号添加到第 3 行,现在看起来像:
if [[ -v $TESTENV ]]; then
但产生:
Hello
Done
什么给了?我希望看到上述一项/两项的“是”。我尝试将 "$TESTENV" 用引号括起来,我也尝试使用 -z 运算符来代替 - 但 行为是相同的。
【问题讨论】:
-
Re: “尝试了
-z运算符” -- 你为什么期望[ -z Hello ]永远是真的?根据定义,它是错误的。当你的变量 isn't 设置,没有引号的扩展,[ -z ]等价于[ -n "-z" ],这是真的(因为-n是测试的默认操作,当只给出一个单操作数)。如果您希望-z有帮助,则需要更多引号:[ -z "$TESTENV" ],因此如果变量为空,您可以调用[ -z '' ]。 -
...这是一个使用
set -x启用日志记录的地方会使问题立即变得明显。 -
感谢@CharlesDuffy,我以前从未使用过
set -x。
标签: bash shell if-statement