Bash sed表达式内变量中的转义字符

Bash sed表达式内变量中的转义字符,bash,sed,Bash,Sed,因此,我有一个问题,我的脚本的这一部分不工作。我不确定到底发生了什么,但我有这种感觉,因为我没有在变量中转义某些字符。我尝试了以下方法,但没有成功: crontab -l | sed "s%$CTMP%\*\/$FREQ \* \* \* \* cd $DIR && \.\/$SCRIPT%" | crontab - 以下是每个变量中的内容: CTMP变量只是crontab文件中的一行 CTMP='*/5 * * * * cd /home/admin/whatever &

因此,我有一个问题,我的脚本的这一部分不工作。我不确定到底发生了什么,但我有这种感觉,因为我没有在变量中转义某些字符。我尝试了以下方法,但没有成功:

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变量是当前工作目录

DIR='/home/admin/whatever'
脚本变量就是脚本文件名

SCRIPT='test.sh'
我觉得问题在于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 -
我还重复了三个转义变量,只是为了排除故障,它们是:

\*/7 \* \* \* \* cd /home/administrator/anm-1\.5\.0 && \./anm\.sh
/home/administrator/anm-1\.5\.0
anm\.sh
三个转义变量实际上看起来不错

*更新*

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 -
替换之前的Cron文件:

*/10 * * * * cd /home/administrator/anm-1.5.0 && ./anm.sh
*/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
替换后的Cron文件:

*/10 * * * * cd /home/administrator/anm-1.5.0 && ./anm.sh
*/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

看到所有以某种方式抛出的多余垃圾了吗?

是的,问题很可能是
$CTMP
包含星号,这些星号被
sed
解释为量词<代码>也是一个特殊字符。尝试逃离它们:

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

尝试设置
noblog
<代码>设置-f在设置
CTMP
之前。可能重复的设置几乎成功!它最终更新了,但它也向cron文件添加了一些重复的内容,但至少这意味着我们非常接近。请参阅上面的代码。@user2272450重复的东西是什么意思?看不到crontab就很难说。换人不止一次吗?匹配的行是什么?@user2272450和crontab的初始内容是什么?不同的测试有些数字可能不同。替换前:**/10****cd/home/administrator/anm-1.5.0和/anm.sh替换后:**/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在这种情况下唯一应该更改的是10应该更改为a7@user2272450 我现在明白了!我会马上更新答案