我了解到我应该在bash中引用变量,例如“ $ foo”而不是$ foo。但是,在编写脚本时,我发现了一种情况,它不带引号但不带引号就可以工作:
wget_options='--mirror --no-host-directories'
local_root="$1" # ./testdir recieved from command line
remote_root="$2" # ftp://XXX recieved from command line
relative_path="$3" # /XXX received from command line
这个作品:
wget $wget_options --directory_prefix="$local_root" "$remote_root$relative_path"
这个不会(注意$ wget_options周围的双引号):
wget "$wget_options" --directory_prefix="$local_root" "$remote_root$relative_path"
这是什么原因呢?
第一行是好的版本;还是我应该怀疑某个地方存在隐藏的错误导致此行为?
通常,在哪里可以找到好的文档来了解bash及其引用的工作原理?在编写此脚本期间,我觉得我开始在反复试验的基础上工作,而不是理解规则。
wget
不知道是什么--mirror --no-host-directories
意思(作为一个参数),但是当它分成两个参数时,它将对其进行处理。很少有程序将空格和引号放入参数向量后才对其进行特殊处理。问题在于bash
,以及其他炮弹,应该是>
bash
所做的事情,因此您可以想象这$a
完全等同于直接编写其内容。现在问题显而易见了:a="-a -b"; cmd "$a"
扩展为cmd "-a -b"
,但cmd
可能不知道这意味着什么。cmd $a
扩展为cmd -a -b
,可能会起作用。