所以我有一个问题,我的脚本的这部分不起作用.我不确定到底发生了什么,但我感觉到它是因为我没有在变量中转义某些字符.我试了以下没有运气:
crontab -l | sed "s%$CTMP%\*\/$FREQ \* \* \* \* cd $DIR && \.\/$SCRIPT%" | crontab -
Run Code Online (Sandbox Code Playgroud)
以下是每个变量中的最新信息:
CTMP变量只是crontab文件中的一行
CTMP='*/5 * * * * cd /home/admin/whatever && ./test.sh'
Run Code Online (Sandbox Code Playgroud)
该FREQ变量是cron文件的以分钟为单位的时间设置
FREQ=5
Run Code Online (Sandbox Code Playgroud)
DIR变量是当前的工作目录
DIR='/home/admin/whatever'
Run Code Online (Sandbox Code Playgroud)
而SCRIPT变量只是脚本文件名
SCRIPT='test.sh'
Run Code Online (Sandbox Code Playgroud)
我觉得问题是sed语句没有更新crontab文件,因为它没有转义上面这些变量所需的字符.
这是正确的还是其他错误的?
*更新*
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 -
Run Code Online (Sandbox Code Playgroud)
*更新*
这是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
Run Code Online (Sandbox Code Playgroud)
我还回应了三个转义变量只是为了排除故障,这里它们是:
\*/7 \* \* \* \* cd /home/administrator/anm-1\.5\.0 && \./anm\.sh
/home/administrator/anm-1\.5\.0
anm\.sh
Run Code Online (Sandbox Code Playgroud)
这三个转义变量实际上看起来不错.
*更新*
替换前的Cron文件:
*/10 * * * * cd /home/administrator/anm-1.5.0 && ./anm.sh
Run Code Online (Sandbox Code Playgroud)
更换后的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
Run Code Online (Sandbox Code Playgroud)
以某种方式看到所有抛出的额外垃圾?
是的,问题很可能$CTMP包含星号,这些星号被sed量词解释..也是一个特殊的角色.尝试逃避它们:
CTMP_ESC=$(sed 's/[\*\.]/\\&/g' <<<"$CTMP")
Run Code Online (Sandbox Code Playgroud)
然后用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 -
Run Code Online (Sandbox Code Playgroud)