2013-06-24 86 views
1

有沒有人在這裏看到任何語法錯誤?Bash sed從cron刪除一行

CTMPESC=$(sed 's/[\*\.&]/\\&/g' <<<"$CTMP") 
crontab -l | sed "/$CTMPESC/d" | crontab - 

CTMP等於一個簡單的cron語句像這樣:

*/8 * * * * cd /home/administrator/anm-1.5.0 && ./anm.sh 

我不斷收到錯誤消息:

的sed:-e表達#1,炭5:未知命令: `8'

回答

1

這裏發生的是CTMPESC中的一個斜槓關閉了模式,並且它後面的任何內容都被解釋爲一個命令。你也需要避開斜線。

添加/到類的人物,你逃脫

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

......或者他們可以以不接受正則表達式的方式進行刪除,因此根本不需要任何轉義,這樣更合理。例如,想想'grep -F -v'。 –

+0

@CharlesDuffy真。但是這個問題是其中的一個,OP也在crontabs上替換了它(使用sed)。無論如何,這是一個非常健全的評論。 –

+0

卓越點查爾斯!列弗讓我把注意力集中在以前的問題上,對於這個完全相同的腳本,我完全忘記了簡單的解決方案。這兩方面都做得很好,但最終還是採用了grep解決方案。謝謝大家! – Atomiklan

2

如果你想這樣做,在利用bash的能力的一種方式,有沒有需要外部工具,如grep的或sed的根本:

ctmp_content=$(<"$ctmp") 
crontab -l | while read -r; do 
    [[ $REPLY = *"$ctmp_content"* ]] && continue 
    printf '%s\n' "$REPLY" 
done | crontab - 
+0

你最後的解決方案工作完美。非常感謝 – Atomiklan

+0

+1原生'bash' +'crontab'解決方案。 – l0b0

+0

Should '[[$ REPLY = *「$ ctmp_content」*]]' 不是 '[[「$ REPLY」== *「$ ctmp_content」*]]' ? –