如何在命令中使用包含引号的Bash变量(字符串)?


Answers:


52

简短的回答:请参阅BashFAQ#50(“我正在尝试将命令放在变量中,但复杂的情况总是失败!”)。

答案很长:将命令(或命令的一部分)放入变量中,然后将它们完整地取出是很复杂的。当shell在命令行上展开变量时,如果变量是双引号,则不解析它; 如果它不在引号中,则其中的空格被解析为参数中断,但不解析引号和转义。在任何一种情况下,将引号放在变量的值中都没有用。

通常,执行此类操作的最佳方法是使用数组而不是简单的文本变量:

FLAGS=(--archive --exclude="foo bar.txt")
rsync "${FLAGS[@]}" dir1 dir2

圣洁的Jezus有效!
Slawomir


-2

我没有看到问题:

$ FLAGS='--archive --exclude="foo bar.txt"'
$ echo $FLAGS
--archive --exclude="foo bar.txt"

也许您需要再次引用该值:

$ rsync "$FLAGS" dir1 dir2

5
echo没有表现出你的想法。试着printargs() { printf "'%s' " "$@"; echo; }; printargs $FLAGS; printargs "$FLAGS"看看为什么这些选项都不起作用。
戈登戴维森
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.