0

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

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

cron 条目将hour是动态的(它可以更改),因此正则表达式中的某种通配符可能很有用,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
4

2 回答 2

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

这将显示更新的内容。该模式匹配并记住行首的非空白序列,后跟一个空白、一个或多个非空白序列和另一个空白,并将其替换为记住的模式、空格、值在$1和一个空白。如果您使用update.sh 7,8,9,10,11,那么您将0 7,8,9,10,11进入您的 crontab。

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

可以想象你可以这样做:

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

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

于 2013-07-26T01:16:18.513 回答
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
于 2013-07-29T15:54:55.457 回答