如何用更新后的字符串替换整行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
答案 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