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。
如果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 次 |
| 最近记录: |