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

mul*_*gon 58 bash

失败的简化示例:

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)

  • 神圣的耶稣它有效! (3认同)