为什么即使变量为空, test -n 也会返回 true?我究竟做错了什么?

Mot*_*oth 1 shell posix test variable-substitution variable

根据test(1)手册页:

       -n STRING
              the length of STRING is nonzero
Run Code Online (Sandbox Code Playgroud)

所以我预计这会运行良好:

       -n STRING
              the length of STRING is nonzero
Run Code Online (Sandbox Code Playgroud)

我在实际案例中使用了这个逻辑,脚本如下:

[ -n ${var} ] && echo "var is not empty"
Run Code Online (Sandbox Code Playgroud)

这里重要的是,当我运行它时,我收到以下消息:

DEBUG: in-loop peopkg:
DEBUG: in-loop wc -c: 0
DEBUG: in-loop test -n: true
DEBUG: wc -c: 0
DEBUG: pdir: a/alsa-firmware
Error: alsa-utils: doesn't exist in local repos
Run Code Online (Sandbox Code Playgroud)

这对我来说毫无意义。DEBUG: pdir: a/alsa-firmware表明循环始终在第一次迭代时退出。仅当 glob 模式 a/alsa* 与某些内容匹配并且 peopkg 的长度非零时才会发生这种情况。

PS:我正在努力兼容 POSIX。

ilk*_*chu 6

如果var包含空字符串,[ -n $var ]则扩展(分词后$var)为单词[,-n]。这是 的单参数版本test,它测试该单个参数是否非空。该字符串-n不为空,因此测试为真。

在 GNU 手册页中,在您引用的段落之后提到了这一点:

   -n STRING
          the length of STRING is nonzero

   STRING equivalent to -n STRING
Run Code Online (Sandbox Code Playgroud)

问题当然是缺少引用,例如为什么我的 shell 脚本因空格或其他特殊字符而阻塞?以及何时需要双引号?

请注意,在不带引号的情况下,不仅空字符串会被破坏。var如果包含多个单词也会出现问题:

$ var='foo bar'; [ -n $var ]
bash: [: foo: binary operator expected
Run Code Online (Sandbox Code Playgroud)

或通配符:

$ var='*'; [ -n $var ]
bash: [: file.txt: binary operator expected
Run Code Online (Sandbox Code Playgroud)


归档时间:

查看次数:

708 次

最近记录:

6 年,2 月 前