crontab
このコマンドが欠落しているBusyboxディストリビューションを開発しています。テキストファイルにリストされている操作でルートのcrontabファイルを更新するbashスクリプトを作成したいと思います。 fgrepを使用してcronファイル内のタスクを検索しようとすると、文字を*
グローバル変数に拡張し、すべてが中断されることを除いて、ほとんどのスクリプトはうまく機能します。
# Notes: CRONJOBS_LIST is the text file containing new jobs.
# CRONJOBS_DIR is the directory where the new jobs will be installed.
# CRONTAB_FILE is /etc/cron/crontabs/[user].
# Find each job in the crontab file. If not found, append it.
while read -r job; do
if ! fgrep -q "$job" "$CRONTAB_FILE"; then
# Appending file in loop avoids adding duplicate jobs if any are found in list
echo "$job" >> "$CRONTAB_FILE"
echo "Added '$job' to $CRONTAB_FILE"
else
echo "'$job' already found in $CRONTAB_FILE"
fi
# Replace variable references in job list with correct paths
done < <(sed -e "s|\$CRONJOBS_DIR|$CRONJOBS_DIR|" "$CRONJOBS_LIST")
誰もが次の行でスクリプトを変更するのに役立ちますかCRONJOBS_LIST
?
2 0 * * * bash $CRONJOBS_DIR/sysbak.sh backup
*
sをグローバル変数に拡張せずにgrepになりますか?
答え1
何をしたいのかを理解している場合は、ファイルからファイルに$ADD
行を追加したいのですが、$TARGET
既にある行を追加したくはありませんか?
繰り返しのgrepよりも簡単な方法があると思います。comm
最初のファイル、2番目のファイル、または両方のファイルにのみ存在する行を提供できるので、これを試してみましょう。
comm -23 <(sort "$ADD") <(sort "$TARGET") > tmp ; cat tmp >> "$TARGET"
議論の-23
意味いいえファイル2に存在する行のみを表示し、いいえ(3) 両方に存在する行を表示します。入力をソートする必要があります。安全のため、一時ファイルで追加します。
無差別代入ソリューションsort
もuniq
機能します。
cat "$ADD" "$TARGET" | sort | uniq > tmp ; mv tmp "$TARGET"
もちろん、これにより結果ファイルがソートされます(既存の重複行は削除されます)。
(もちろんもっと作りたいかもしれませんが、一意の一時ファイル名.)
現在のコードでは、一致するものが見つかると0が返され、ほとんどのプログラミング環境とは異なり、シェルスクリプトでは0がtrueで動作するfgrep
ため、条件は逆だと思います。grep
また something | while read ...
、同じように動作する必要がありますwhile... < <(something)
が、読みやすくなります。