如何可靠地将Bash变量通过awk -v传递为精确字符串?
通过
-v选项将Bash变量作为字面字符串传递给awk的可靠方法 问题
我需要一种可靠的方法,通过-v选项将Bash变量传递给awk,让最终的awk变量完全保留Bash变量中的原始字符串。
示例代码:
#!/bin/bash b='dir\t\010\out' awk -v a="$b" 'BEGIN{print a}'
预期输出:
dir\t\010\out
我猜测把反斜杠加倍可能可行,但不确定这种方法是否适用于所有字符串,请问有没有通用的解决办法?
解决方案
(注:此答案在问题关闭前未及时发布)
虽然通过ENVIRON数组读取环境变量是最简单的方式,但如果你需要通过-v选项传递变量,下面是一种可以将Bash变量转义后,作为字面字符串传递给任何POSIX兼容awk的方法:
#!/bin/bash awk_esc() { local v="${1//\\/\\\\}" printf %s "${v//$'\n'/\\n}" } b='A\t B' awk -v a="$(awk_esc "$b")" 'BEGIN{print a}'
输出结果:
A\t B
内容的提问来源于stack exchange,提问作者Fravadona
相关产品推荐
相关产品推荐

