【发布时间】:2023-03-18 19:32:01
【问题描述】:
我将程序的命令行参数存储在 bash 数组中,其中一个参数可以包含空格。 X=(A B "C D" E)
我有另一个约束,我需要通过bash -c 语句来执行我的程序。 (技术上是... | xargs bash -c "./a.out ..." 声明)
当我这样做时,我最终会破坏命令中的空格。我怎样才能正确地做到这一点?
我写了一个快速的 c++ 程序来输出命令行参数来代表我的程序
#include <iostream>
int main(int argc, char** argv)
{
for (int i = 1; i < argc; ++i)
std::cout << '"' << argv[i] << '"' << std::endl;
return 0;
}
我正在寻找来自./a.out "${X[@]}"的输出
"A"
"B"
"C D"
"E"
但是当我测试这个 bash -c "./a.out ${X[@]}" 时,我只是得到了
"A"
当我测试这个 bash -c "./a.out ${X[*]}" 时,它会破坏空格,然后我得到
"A"
"B"
"C"
"D"
"E"
我能做什么?
【问题讨论】:
-
顺便说一句,我认为这是 BashFAQ #50 的一个特例;见mywiki.wooledge.org/BashFAQ/050
-
顺便说一句,您是否希望我的回答涉及为什么您的尝试会按照他们的方式行事,而不是只讨论正确的事情?
-
(说到正确的事情,一个更简单的以文字形式显示参数的测试程序将是一个 bash 脚本,在 shebang 之后有一行:
printf '%q\n' "$@";您可以使用'"%s"\n'获得等效行为,但该输出格式不明确,因为参数可以包含引号和换行符)。 -
谢谢。我会读一读。我在玩 IFS,试图让空间不混合,但感觉不对。我的同事刚刚说“摆脱空间”,但感觉就像失去了学习的机会。
-
如果目标是学习,我将扩展答案以详细了解您尝试过的事情的行为方式。