首页 > 解决方案 > 如何处理一行bash命令中的多个引号?

问题描述

例如,如果我的目标是运行这样的单行 bash 命令,

sudo bash -c ' sudo bash -c '' sudo bash -c ''' echo ''''1234'''' ''' '' '

它不起作用。

我也尝试了第二个命令,

sudo bash -c ' sudo bash -c " sudo bash -c ''' echo ""1234"" ''' " '

也不行。

sudo bash -c ' sudo bash -c " echo '''123''' " '

第三个,它确实有效,但顶部只有 3 个级别。

那么,有没有一种实际的方法可以让这个命令只使用引号技巧?

标签: linuxbash

解决方案


如何处理一行bash命令中的多个引号?

使用函数,declare -fprintf "%q"正确引用内容。不要自己做。

# Function to run, just normally write stuff to execute.
work() {
    echo "1234"
}
# Script to run - contains work function definition and calls work.
script="$(declare -f work); work"
# bash -c "$script"
# quote it
script2="$(printf " %q" bash -c "$script")"
# bash -c "$script2"
# Well, no point, but an example, quote it again:
script3="$(printf " %q" bash -c "$script2")"
bash -c "$script3"
printf "%q " bash -c "$script3"

输出:

1234
bash -c \ bash\ -c\ \\\ bash\\\ -c\\\ \\\$\\\'work\\\ \\\(\\\)\\\ \\\\n\\\{\\\ \\\\n\\\ \\\ \\\ \\\ echo\\\ \\\"1234\\\"\\\\n\\\}\\\;\\\ work\\\' 

您可以将该行复制bash -c ....到您的终端并执行它。

如果你想要不同的引用风格,你可以使用 bash 特殊${var@Q}变量扩展或/bin/printfcoreutils 中的可执行文件。

有没有一种实际的方法可以让这个命令只使用引号技巧?

不,引号是按 par 分组的,写多个引号是没有用的,并且用于可读性。在你的例子'bash -c ''''1234'''''中只是'qouted stuff'unqouted stuff'quoted stuff'unqouted stuff' etc... 做''''任何事情都不会改变。您必须转义\'引号以保留它们的字面意思。


推荐阅读