很复杂的shell字符串有很多引号,如何处理逃逸

时间:2013-04-28 21:00:10

标签: linux bash shell

我有一个字符串:

str='sudo nohup bash -c "kill -9 `ps -ef|grep "udp_receiver"|grep -v "grep"|awk '{print $2}'` > /nohup.out 2>&1 &"'

有很多引用 以上变量不正确

我试过

str='sudo nohup bash -c "kill -9 `ps -ef|grep \"tcp\"|grep -v \"grep\"|awk \'{print $2}\'` > /nohup.out 2>&1 &"'

仍然不正确 如何修改它以使其正确? 感谢

2 个答案:

答案 0 :(得分:1)

str="sudo nohup bash -c 'kill -9 $(ps -ef|grep udp_receiver|grep -v grep|awk \"{print $2}\") > /nohup.out 2>&1 &'"

我还没有检查过,但这应该是关于它的。

但是,请查看procps的{​​{1}}命令

pkill

应该做同样的事情。它会自动避免自我杀死(请参阅manpage)。另请注意,您可以先查询事物以测试您的模式:

pkill -f udp_receiver

答案 1 :(得分:0)

一个有趣的技巧是摆脱传统的转义,使用插值来扩展元字符。我会让你调试它并调整你的环境。

sq="'";   #single quote
dq='"';   #double quote
xq='`';   #execution quote
dol='$';  #dollar sign
str="sudo nohup bash -c ${dq}kill -9 ${xq}ps -ef|grep ${dq}udp_receiver$dq|grep -v ${dq}grep$dq|awk ${sq}{print ${dol}2}$sq$xq > /nohup.out 2>&1 &$dq"