SH/BASH:在变量中存储带有空格的命令参数

SH/BASH:在变量中存储带有空格的命令参数

我试图将命令字符串存储在变量中以供以后执行。问题在于该命令包含带有空格的参数参数。执行命令时,shell 不会将参数视为单个字符串,而是将其解释为两个字符串,包括双引号字符:

例子:

$ CMD_CMAKE="cmake -G \"MSYS Makefiles\" ../../source/poppler-0.79/"

$ ${CMD_CMAKE}
CMake Error: Could not create named generator "MSYS

我需要传递-G "MSYS Makefiles"cmake命令。相反,-G \"MSYS并且Makefiles\"正在通过。

我已尝试以下所有方法但没有成功:

$ CMD_CMAKE='cmake -G "MSYS Makefiles" ../../source/poppler-0.79/'

$ CMD_CMAKE="cmake -G 'MSYS Makefiles' ../../source/poppler-0.79/"

$ CMD_CMAKE="cmake -G MSYS\ Makefiles ../../source/poppler-0.79/"

$ CMD_CMAKE="cmake -G MSYS\\ Makefiles ../../source/poppler-0.79/"

$ GEN="MSYS Makefiles" && CMD_CMAKE="cmake -G ${GEN} ../../source/poppler-0.79/"

$ GEN="MSYS Makefiles" && CMD_CMAKE="cmake -G \"${GEN}\" ../../source/poppler-0.79/"

$ CMD_CMAKE=$(echo "cmake -G \"MSYS Makefiles\" ../../source/poppler-0.79/")

$ CMD_CMAKE=$(echo 'cmake -G "MSYS Makefiles" ../../source/poppler-0.79/')

我在谷歌上做了一些搜索,但没有找到任何答案。也许是因为我没有使用正确的术语。

编辑: 抱歉,我想我应该在 stackoverflow.com 上发布这个问题。

答案1

感谢 jesse_b 和 Kusalananda 帮助找到了这个解决方案。

其实很简单。要存储命令及其参数,请将它们放入数组中,并将所有带空格的参数括在双引号内:

CMD_CMAKE=(cmake -G "MSYS Makefiles" ../../source/poppler-0.79/)

要执行它,变量应该用双引号引起来:

"${CMD_CMAKE[@]}"

frabjous提到的另一个解决方案是使用命令eval

CMD_CMAKE="cmake -G \"MSYS Makefiles\" ../../source/poppler-0.79/"
eval ${CMD_CMAKE}

相关内容