我何时应该使用“”来引用shell测试和echo中的值?

时间:2017-07-18 03:43:28

标签: linux bash shell

我正在写这样的bash脚本:

VF_ETH=$(command)
if [ -n "$VF_ETH" ] ; then
    echo "ixgbevf eth: "$VF_ETH
fi

命令是linux命令,我的问题是:

  1. $VF_ETH是为了获得VF_ETH的值,为什么要使用""在shell测试line2中引用它?
  2. 如果我不使用""引用它,测试会失败吗?
  3. 如果使用""引用某个值是为了使其成为字符串,为什么不在line3中使用echo?
  4. 谢谢

3 个答案:

答案 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(非空和空)。在变量周围添加引号可以解决这个问题。

  1. 设置$VF_ETH="*"。现在,如果echo $foo bash会进行通配符扩展,echo将输出当前目录的内容。