fgrep 文字列のグローバル拡張の防止

fgrep 文字列のグローバル拡張の防止

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) 両方に存在する行を表示します。入力をソートする必要があります。安全のため、一時ファイルで追加します。

無差別代入ソリューションsortuniq機能します。

cat "$ADD" "$TARGET" | sort | uniq > tmp ; mv tmp "$TARGET"

もちろん、これにより結果ファイルがソートされます(既存の重複行は削除されます)。

(もちろんもっと作りたいかもしれませんが、一意の一時ファイル名.)


現在のコードでは、一致するものが見つかると0が返され、ほとんどのプログラミング環境とは異なり、シェルスクリプトでは0がtrueで動作するfgrepため、条件は逆だと思います。grepまた something | while read ...、同じように動作する必要がありますwhile... < <(something)が、読みやすくなります。

関連情報