linux - 如何处理一行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 个级别。
那么,有没有一种实际的方法可以让这个命令只使用引号技巧?
解决方案
如何处理一行bash命令中的多个引号?
使用函数,declare -f
并printf "%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/printf
coreutils 中的可执行文件。
有没有一种实际的方法可以让这个命令只使用引号技巧?
不,引号是按 par 分组的,写多个引号是没有用的,并且用于可读性。在你的例子'bash -c ''''1234'''''
中只是'qouted stuff'unqouted stuff'quoted stuff'unqouted stuff' etc..
. 做''''
任何事情都不会改变。您必须转义\'
引号以保留它们的字面意思。
推荐阅读
- python - 如何查找重复行并在新列中分配 ID
- c++ - 使用类型作为字段时,为什么不能推迟不完整类型(前向声明)的大小计算?
- ubuntu - Ansible 动态库存脚本 - 奇怪的行为
- vba - 如何从表格保存到表格?
- arrays - 配置单元中正则表达式中的多个匹配项
- laravel - Why DB:select work and DB::table doesn't work?
- .net - 成功登录后如何重定向到登录发生的同一区域
- typo3 - 覆盖 Rte.ts Extbase
- c# - Ajax POST 到 Asp.net MVC
- apache - 如何使用本地主机访问 html 文件