linux
  • bash
  • shell
  • 2013-04-28 56 views 2 likes 
    2

    我有一个字符串:非常复杂的外壳串了很多报价,如何处理逃逸

    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 &"' 
    

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

    回答

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

    我已经不容易检查,但是,这个应该是它。

    但是,不要看procpspkill命令

    pkill -f udp_receiver 
    

    应该做的一样。它会自动避免自杀(请参阅manpage)。另外请注意,您可以先询问事情来测试你的模式(S):

    pgrep -fl udp_receiver 
    
    +0

    因此,在$()中使用双引号'''在外面有'''时不会引起问题? – misteryes 2013-04-28 21:18:54

    +0

    确实。这完全取决于扩展的顺序。事实上,如果你愿意,你可以'echo'$(pkill -f“$ 1”)“”。另外请参阅bash builtin'printf'%q'' – sehe 2013-04-28 21:27:43

    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" 
    
    相关问题