【发布时间】:2021-12-26 22:59:12
【问题描述】:
命令printf %q(来自 GNU coreutils 或 bash)可用于引用一系列参数,包括空格、换行符和引号。例如:
$ main() { printf '%q ' "${@}"; } && main "'a'" '"b"' 'c d' $'e\nf'
\'a\' \"b\" c\ d $'e\nf'
是否可以反转这个操作,即从printf %q创建的字符串创建一个参数数组
- 在 POSIX shell 中?
- 在 Bash 中?
- 使用其他工具?
此问题的用例
“参数提供者”使用printf %q "${@}" 将参数列表包装在单个字符串中。参数可以包含任意内容,包括但不限于:引号、带换行符的引号字符串、由printf %q 创建的字符串。应使用 shell 脚本将字符串解包到参数数组中。展开应避免 eval 和未加引号的变量。该字符串可以作为命令行参数或标准输出/标准输入传递。
见解
-
xargs不处理带引号的换行符。 -
zshcan do this 用于存储在变量args中的字符串:"${(Q@)${(z)args}}"
【问题讨论】:
-
这对我来说听起来很XY。你实际上想要完成什么?上下文是什么?
-
谢谢。由于缺少上下文,我最初的问题似乎不清楚。我添加了一个部分来解释我的用例,并希望现在提供足够的上下文。
标签: bash shell arguments posix quoting