bash
  • sed
  • 2013-06-24 35 views 3 likes 
    3

    所以即时通讯有问题,我的脚本的这部分不工作。我不确定到底发生了什么,但是我感觉它是因为我没有逃过变量中的某些字符。我试过,没有运气以下:在sed表达式中的变量中转义字符

    crontab -l | sed "s%$CTMP%\*\/$FREQ \* \* \* \* cd $DIR && \.\/$SCRIPT%" | crontab - 
    

    这里是什么在每个变量:

    的CTMP变量是距离crontab文件

    CTMP='*/5 * * * * cd /home/admin/whatever && ./test.sh' 
    

    FREQ变量是线cron文件的时间以分钟为单位设置

    FREQ=5 
    

    DIR变量是cu rrent工作目录

    DIR='/home/admin/whatever' 
    

    和脚本变量只是脚本文件名

    SCRIPT='test.sh' 
    

    我觉得这个问题是sed的语句未更新的crontab文件,因为它不是逃避它需要的字符到上面这些变量的里面。

    这是正确的还是其他错误?

    * UPDATE *

    CTMPESC=$(sed 's/[\*\.]/\\&/g' <<<"$CTMP") 
    DIRESC=$(sed 's/[\*\.]/\\&/g' <<<"$DIR") 
    SCRIPTESC=$(sed 's/[\*\.]/\\&/g' <<<"$SCRIPT") 
    crontab -l | sed "s%$CTMPESC%\*/$FREQ \* \* \* \* cd $DIRESC && \./$SCRIPTESC%" | crontab - 
    

    * UPDATE *

    下面是crontab的输出

    */10 * * * * cd /home/administrator/anm-1.5.0 */7 * * * * cd /home/administrator/anm-1.5.0 && ./anm.sh*/7 * * * * cd /home/administrator/anm-1.5.0 && ./anm.sh ./anm.sh 
    

    ,我也附和三个逃脱变量只是为了解决这里它们是:

    \*/7 \* \* \* \* cd /home/administrator/anm-1\.5\.0 && \./anm\.sh 
    /home/administrator/anm-1\.5\.0 
    anm\.sh 
    

    三个转义变量实际上看起来不错。

    * UPDATE *

    的Cron之前文件替换:

    */10 * * * * cd /home/administrator/anm-1.5.0 && ./anm.sh 
    

    的Cron后的文件替换:

    */7 * * * * cd /home/administrator/anm-1.5.0 */10 * * * * cd /home/administrator/anm-1.5.0 && ./anm.sh*/10 * * * * cd /home/administrator/anm-1.5.0 && ./anm.sh ./anm.sh 
    

    看到所有被在那里抛出莫名其妙的额外的垃圾?

    +0

    尝试设置'noblog'。 'set -f'在设置'CTMP'之前。 – devnull

    +0

    可能重复的[转义sed搜索模式字符串](http://stackoverflow.com/questions/407523/escape-a-string-for-sed-search-pattern) – l0b0

    回答

    6

    是的,问题可能是$CTMP包含星号,它被sed解释为量词。 .也是一个特殊字符。尝试逃脱他们:

    CTMP_ESC=$(sed 's/[\*\.]/\\&/g' <<<"$CTMP") 
    

    然后用CTMP_ESC代替CTMP

    而且,你不需要在你的sed命令逃脱/,因为你不使用它作为s///分离。

    编辑:还需要逃避更换&,因为sed解释&为“匹配的字符串”。所以您的脚本应为:

    CTMPESC=$(sed 's/[\*\.&]/\\&/g' <<<"$CTMP") 
    DIRESC=$(sed 's/[\*\.&]/\\&/g' <<<"$DIR") 
    SCRIPTESC=$(sed 's/[\*\.&]/\\&/g' <<<"$SCRIPT") 
    crontab -l | sed "s%$CTMPESC%\*/$FREQ \* \* \* \* cd $DIRESC \&\& \./$SCRIPTESC%" | crontab - 
    
    +1

    这几乎工作!它最终更新了,但它也向cron文件添加了一些重复的东西,但至少这意味着我们非常接近。看到我上面的代码。 – Atomiklan

    +0

    @ user2272450你是什么意思的重复的东西?很难说没有看到crontab。换人不止一次?匹配的线是什么? –

    +0

    更新已添加上面 – Atomiklan

    相关问题