失败的简化示例:
FLAGS='--archive --exclude="foo bar.txt"'
rsync $FLAGS dir1 dir2
Run Code Online (Sandbox Code Playgroud)
我需要包含引号,就像命令是这样的:
rsync --archive --exclude="foo bar.txt" dir1 dir2
Run Code Online (Sandbox Code Playgroud)
Gor*_*son 67
简短回答:请参阅BashFAQ #50(“我正在尝试将命令放入变量中,但复杂的情况总是失败!”)。
长答案:将命令(或命令的一部分)放入变量中,然后将它们原封不动地取出来是很复杂的。当 shell 在命令行上扩展一个变量时,如果变量被双引号括起来,它就不会被解析;如果它不在引号中,则其中的空格将被解析为参数中断,但不会解析引号和转义符。在任何一种情况下,在变量的值中加上引号都没有任何用处。
通常,执行此类操作的最佳方法是使用数组而不是简单的文本变量:
FLAGS=(--archive --exclude="foo bar.txt")
rsync "${FLAGS[@]}" dir1 dir2
Run Code Online (Sandbox Code Playgroud)
eval是另一种选择:
$ x="'a b'"
$ printf '%s,%s' $x
'a,b'
$ eval printf '%s,%s' $x
a b
Run Code Online (Sandbox Code Playgroud)
也可以看看:
| 归档时间: |
|
| 查看次数: |
56554 次 |
| 最近记录: |