在Bash变量中转义awk参数并存储awk命令用于自动执行
如何将带引号的awk命令存入Shell变量并执行?
嗨,这个问题我碰到过好几次——当要把像这条awk这样带嵌套引号的复杂命令存进变量时,直接用普通的双引号包裹肯定会踩坑,因为Shell会把内部的引号当成变量的结束标记,直接报错。我给你分享几种靠谱的解决方法:
方法1:用数组存储(最推荐)
用数组来保存命令是最稳妥的方式,它能完美处理带空格、引号的参数,避免Shell解析时的各种意外:
# 把命令拆分成数组元素,每个参数独立存储 AUTO_SCRIPT=(awk -v par="eth0" '/^iface/ && $2==par {print}' /etc/network/interfaces)
执行的时候直接用下面的命令,保证每个参数都被正确解析:
"${AUTO_SCRIPT[@]}"
方法2:用单引号包裹整个命令(需转义内部单引号)
如果一定要用字符串变量,可以用单引号把整个命令包起来,但要注意awk里的单引号需要用'\''这个序列转义(因为Shell单引号内部不能直接放单引号):
AUTO_SCRIPT='awk -v par="eth0" '\''/^iface/ && $2==par {print}'\'' /etc/network/interfaces'
执行时直接运行:
$AUTO_SCRIPT
方法3:用双引号包裹并转义内部特殊字符
这种方式需要转义内部的双引号,还要把awk里的$2转义(不然Shell会在赋值时把$2当成当前Shell的第二个参数解析,而不是留给awk):
AUTO_SCRIPT="awk -v par=\"eth0\" '/^iface/ && \$2==par {print}' /etc/network/interfaces"
执行同样用:
$AUTO_SCRIPT
总的来说,数组方法是最优解,它能最大程度避免引号和参数解析的问题,在自动化脚本里用起来最省心。
内容的提问来源于stack exchange,提问作者Daniel
相关产品推荐
相关产品推荐

