用shell脚本中的字符串替换变量中的行

时间:2013-07-26 00:53:28

标签: bash replace

如何用更新后的字符串替换整行0 6 * * 0 /root/SST/myscript.sh

该脚本将使用update.sh 7运行,0 6 * * 0 /root/SST/myscript.sh将替换为0 7 * * 0 /root/SST/myscript.sh

hour cron条目将是动态的(它可以更改),因此正则表达式中的某种通配符可能有用,0 * * * 0 /root/SST/myscript.sh

[root@local ~]# crontab -l    
0 1 * * 0 /root/SST/test.sh
0 6 * * 0 /root/SST/myscript.sh
0 10 * * 0 /root/SST/test.sh

Shell脚本内容update.sh

#!/bin/bash

tmpfile=$(crontab -l)

if [[ "$tmpfile" == *myscript.sh* ]]
then
    #update myscript.sh within crontab contents

    echo "$updatedfileContents";
fi

2 个答案:

答案 0 :(得分:0)

crontab -l |
sed '/myscript.sh/ s/^\([^ ][^ ]*\) [^ ][^ ]* /\1 '"$1" '/'

这将显示更新的内容。模式匹配并记住行开头的一系列非空白,然后是空白,一个或多个非空白的序列,以及另一个空白,并将其替换为记忆模式,空格,值在$1和空白。如果您使用update.sh 7,8,9,10,11,则会在您的crontab中获得0 7,8,9,10,11

您可以在变量中捕获该命令的输出,然后将其(小心地;使用双引号)回显到crontab以更改实际条目。

可以想象你可以这样做:

crontab -l |
sed '/myscript.sh/ s/^\([^ ][^ ]*\) [^ ][^ ]* /\1 '"$1" '/' |
(sleep 1; crontab)

sleep使crontab -l有机会在被新值破坏之前获取当前值 - 可能!可能值得考虑将您的crontab保留在VCS(版本控制系统)下以避免丢失它 - 特别是如果您尝试sleep技巧。

答案 1 :(得分:0)

我最后得到了这个答案./update.sh 8

#!/bin/bash

updatedCrontab=""
tmpfile=$(crontab -l)

while read -r line; do
    if [[ "$line" == *myscript.sh* ]]
    then
            updatedCrontab+="0 $1 * * 0 myscript.sh\n"
    else
            updatedCrontab+="$line\n"
    fi
done <<< "$tmpfile"

echo -e "$updatedCrontab" | crontab

结果:

[root@local ~]# crontab -l
0 1 * * 0 /root/SST/test.sh
0 8 * * 0 /root/SST/myscript.sh
0 10 * * 0 /root/SST/test.sh