Shell:测试 -n/-z 上只有双引号?

Tuy*_*ham 1 command-line shell shell-script shell-builtin

例如,如果test -e是:

VAR="<this is a file path: /path/to/file/or/dir"
test -e $VAR && do_something || do_anotherthing
Run Code Online (Sandbox Code Playgroud)

问题:我应该"$VAR"在这里使用吗?如果没有必要,这里我不喜欢冗长,因为$VAR显然在这种情况下是一条路径,那么如果它是空字符串,它应该总是失败,因为没有路径是空字符串,然后按照我的逻辑,双引号是没有必要的。

但它是字符串测试的情况,测试 -n 例如:

VAR="<this is a string"
test -n $VAR && do_something || do_anotherthing
Run Code Online (Sandbox Code Playgroud)

然后按照我的逻辑,$VAR应该放在双引号中:"$VAR"因为它可以扩展为空字符串,如果不在双引号中,则将仅扩展为-n参数并且始终为真。

因此,真正的问题是因为我怀疑我们是否应该在测试命令中仅在字符串-n-z字符串中使用双引号?

Kam*_*ski 5

一般规则是对任何变量加双引号,除非您希望 shell 对其内容执行标记分割和通配符扩展。

因为$VAR显然在这种情况下是一条路径,那么如果它是空字符串,它应该总是失败 [...] 然后按照我的逻辑,双引号是没有必要的。

恰恰相反。不带操作数的行为test -e是在这种特殊情况下应引用变量的另一个原因:

$ unset foo      # or foo=""
$ test -e $foo   # note this is equivalent to `test -e'
$ echo $?
0
$ test -e "$foo"
$ echo $?
1
$
Run Code Online (Sandbox Code Playgroud)