【发布时间】:2016-01-14 23:43:28
【问题描述】:
我正在搜索一个命令,它使用特定的分隔符分隔所有给定的参数,并将它们引用输出。
示例(分隔符设置为冒号:):
somecommand "this is" "a" test
应该输出
"this is":"a":"test"
我知道 shell 在将参数传递给命令之前会解释 "" 引号。所以这个命令实际上应该做的是打印出引号中的每个给定参数,并用冒号分隔所有这些。
我也不是寻求仅 bash 的解决方案,而是寻求最优雅的解决方案。
循环遍历这些元素的数组并执行此操作非常容易,但问题是我必须在 gnu makefile 中使用它,它只允许 单行 shell 命令 并使用 @987654325 @ 而不是 bash。
所以越简单越好。
【问题讨论】:
-
“循环很容易” - 那你为什么不这样做呢?
-
因为在 gnu makefile 中我只能有单行语句,而且它们只会在 shell 而不是 bash 中执行。
-
通过“引用它们的输出”——引用的目标到底是什么?是否打算成为
eval-safe 引用?它应该如何处理数据中的文字引号字符?什么构成正确的引用取决于什么软件将解析给定的字符串,我不相信这个问题具体说明了这一点。 -
顺便说一句,你确实意识到你可以从你的makefile控制使用哪个shell,对吧?
-
非常非常清楚——这里的引用不是
eval-safe(也不会简单地替换单引号)。如果您在参数中有'$(rm -rf ~)',它将在双引号中发出,并在评估时执行;而$'\'$(rm -rf ~)\''将是一个能够转义单引号等的版本。如果你想生成 eval 安全的引用,那是printf %q的工作(而生成有效的 JSON 引用是jq的工作,生成 Python-安全引用是python -c 'import sys; print repr(sys.argv[1])'等的工作。
标签: linux bash shell makefile gnu-make