在我的 Bash 环境中,我使用包含空格的变量,并在命令替换中使用这些变量。
引用我的变量的正确方法是什么?如果这些是嵌套的,我该怎么做?
DIRNAME=$(dirname "$FILE")
Run Code Online (Sandbox Code Playgroud)
或者我在替换之外引用?
DIRNAME="$(dirname $FILE)"
Run Code Online (Sandbox Code Playgroud)
或两者?
DIRNAME="$(dirname "$FILE")"
Run Code Online (Sandbox Code Playgroud)
还是我使用反引号?
DIRNAME=`dirname "$FILE"`
Run Code Online (Sandbox Code Playgroud)
这样做的正确方法是什么?以及如何轻松检查报价是否正确?
过去的旧建议是对任何涉及 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
可以省略 内部的双引号[[ ... ]]
,但不能省略内部 …
当我打开一个 bash 提示符并输入:
$ set -o xtrace
$ x='~/someDirectory'
+ x='~/someDirectory'
$ echo $x
+ echo '~/someDirectory'
~/someDirectory
Run Code Online (Sandbox Code Playgroud)
我希望上面的第 5 行会出现+ echo /home/myUsername/someDirectory
。有没有办法做到这一点?在我的原始 Bash 脚本中,变量 x 实际上是从输入文件中的数据填充的,通过这样的循环:
while IFS= read line
do
params=($line)
echo ${params[0]}
done <"./someInputFile.txt"
Run Code Online (Sandbox Code Playgroud)
尽管如此,我得到了类似的结果,echo '~/someDirectory'
而不是echo /home/myUsername/someDirectory
.
来自https://unix.stackexchange.com/a/32227/674
不使用双引号是安全的主要地方是:
- 在赋值中:(
foo=$bar
但请注意,您确实需要export "foo=$bar"
在数组赋值中或数组赋值中 使用双引号array=("$a" "$b")
);
这是否意味着不需要$bar
在赋值中双引号foo=$bar
?为什么?
为什么我们需要export "foo=$bar"
像这样的数组赋值中的双引号array=("$a" "$b")
?
谢谢。