我正在写这样的bash脚本:
VF_ETH=$(command)
if [ -n "$VF_ETH" ] ; then
echo "ixgbevf eth: "$VF_ETH
fi
命令是linux命令,我的问题是:
$VF_ETH
是为了获得VF_ETH
的值,为什么要使用""
在shell测试line2
中引用它?""
引用它,测试会失败吗?""
引用某个值是为了使其成为字符串,为什么不在line3
中使用echo?谢谢
答案 0 :(得分:2)
假设您获得了存储在VF_ETH
变量中的实际命令,该变量包含空格。现在,如果您使用if [ -n $VF_ETH ]
并且当shell扩展变量时,-n
将有多个参数,而它只需要一个。{1}}。因此,您可能会遇到binary operator expected
错误。
同样在echo命令中,不必只有一个参数。因此,即使您没有使用双引号,也可以。
因此要避免它,在扩展变量时总是使用双引号。
还可以使用https://www.shellcheck.net/检查您的脚本,它会根据标准为您提供有关脚本错误/不正确位置的正确信息。
答案 1 :(得分:2)
您应该始终在命令行参数和[ ... ]
测试中使用双引号变量,例如:
ls "$var"
echo "$var"
[ -f "$var" ]
test -f "$var"
在上面的所有示例中,当$var
的值以一堆空格开头且包含一些空格时,使用和不使用双引号的命令将使用不同的值。例如:
var=" an apple"
echo "$var" # prints " an apple"
echo $var # prints "an apple", without the leading space
您不需要在简单分配中引用它们,例如:
a=$var
a=$var$b
如果赋值包含空格或其他特殊字符,则必须引用或转义这些特殊字符:
a="$var $b"
a=$var\ $b
a=$var" "$b
以上所有内容都是等效的,但第一个可能是最容易阅读的,因此建议使用。
您不需要引用从不具有不安全值的特殊变量,例如:
test $? = 0
如果你不确定,或者还不自信,那么拇指的一个好角色就是双重引用。
答案 2 :(得分:0)
对于1.和2.如果设置$VF_ETH="x -a -z x"
并使用代码进行测试:
if [ -n $VF_ETH ] ; then
echo yes
else
echo nope
fi
输出将为nope
,因为方括号内部将扩展为-n x AND -z x
(非空和空)。在变量周围添加引号可以解决这个问题。
$VF_ETH="*"
。现在,如果echo $foo
bash会进行通配符扩展,echo
将输出当前目录的内容。