或者,有关强大的文件名处理和在 shell 脚本中传递的其他字符串的介绍性指南。
我写了一个 shell 脚本,它在大多数情况下运行良好。但它在某些输入(例如某些文件名)上窒息。
我遇到了如下问题:
hello world,它被视为两个单独的文件hello和world.\[*?,它们会被一些文本替换,这实际上是文件的名称。'(或双引号"),在那之后事情变得很奇怪。\分隔符)。这是怎么回事,我该如何解决?
过去的旧建议是对任何涉及 a 的表达式加双引号$VARIABLE,至少在希望 shell 将其解释为单个项目的情况下,否则,内容中的任何空格$VARIABLE都会脱离 shell。
但是,我知道在较新版本的 shell 中,不再总是需要双引号(至少出于上述目的)。例如,在bash:
% FOO='bar baz'
% [ $FOO = 'bar baz' ] && echo OK
bash: [: too many arguments
% [[ $FOO = 'bar baz' ]] && echo OK
OK
% touch 'bar baz'
% ls $FOO
ls: cannot access bar: No such file or directory
ls: cannot access baz: No such file or directory
Run Code Online (Sandbox Code Playgroud)
在zsh,而另一方面,同样的三个命令成功。因此,基于此实验,似乎在 中bash可以省略 内部的双引号[[ ... ]],但不能省略内部 …
我有一个无法检测零长度字符串的脚本,该脚本[ -n $value ]在 bash 条件表达式中使用,即
#!/usr/bin/env bash
value=""
if [ -n $value ]
then
echo "value is non-zero"
fi
Run Code Online (Sandbox Code Playgroud)
结果
值不为零
如果我使用[[ -n $value ]]它有效,即
#!/usr/bin/env bash
value=""
if [[ -n $value ]]
then
echo "value is non-zero"
fi
Run Code Online (Sandbox Code Playgroud)
using[[不会产生预期的输出。从手册页:
Run Code Online (Sandbox Code Playgroud)[[ expression ]] Return a status of 0 or 1 depending on the evaluation of the conditional expression expression. Expressions are composed of the pri? maries described below under CONDITIONAL EXPRESSIONS. Word splitting …
我知道test -n <expression>如果表达式的计算结果为大于 0 的字符串长度,则返回 false。为什么会发生以下情况?
Macbook:~ echo ${#undeclared_variable}
0
Macbook:~ test -n $undeclared_variable && echo Foo
Foo
Run Code Online (Sandbox Code Playgroud)
重击 4.x
我的期望是,既然test -n $undeclared_variable应该评估 false,那么 Foo 不应该被回应。如果我使用[[ ]]而不是测试,它会按预期工作。