Bash:シェルスクリプトは、渡されたすべての引数に一致するファイルを削除しますか?

Bash:シェルスクリプトは、渡されたすべての引数に一致するファイルを削除しますか?

これは宿題の質問なので、答えやスクリプトを直接探していません。だから私の質問の1つから、以下を含むファイルを削除するように求められました。どのコマンドライン引数が渡されました。これはスクリプトの断片です。

#!/bin/sh

#some more stuff here

for args in "$@"; do
    if  [ $#  != 0 ]; then
        grep -l $args * | while read theFile; 
        do
            if [ -f "$theFile" ] ; then
                rm "$theFile"
                echo "$theFile is deleted with $args match"
            else
                echo "$theFile not deleted"
                exit 2
            fi
        done #end of while loop
    else 
        echo "No match found with $args"
        exit 1
    fi
    done
echo "DONE"
exit 0 

今私は知りたい次のファイルを削除するスクリプトをどのように作成しますか?みんな議論?各ファイルにforループを介して渡されるパラメータがあるかどうかを確認する必要があることを知っていますが、それを書く方法がわかりません。どんなアドバイスも本当にありがとうございます。

この情報が必要な場合は、練習用にcloud9を使用しています。

ベストアンサー1

次に、キーワード()を繰り返し、for arg in..各キーワードについてそのキーワード(grep -l $arg *)を含むファイルを確認します。

すべてのキーワードを含むファイルを確認するには、それを元に戻してすべてのファイルを繰り返す()、キーワードを繰り返しfor f in *for arg in "$@")し、ファイルにそのキーワードが含まれていることを確認(grep -qe "$arg" "$f")し、すべてのファイルが削除と一致する場合にのみ削除できます。

そうするから少し暴力的grep N*時間、...についてNファイルとキーワード。別のアプローチは、grep -l最初のキーワードを実行してからgrep -l2番目のキーワードを実行して、grep最後のgrepから返されたファイルのリストを提供するなどの方法です。各ステップでファイルのリストを配列として保存できます。


ちなみに、これは言葉ではありません:

for args in "$@"; do
    if  [ $#  != 0 ];

各引数に対して1回実行されるループ内で数値引数を確認しています。$#引数がなければまったくゼロですが、"$@"何も含まず、ループは実行されません。

ここで:

grep -l $args * | while read theFile; 

おそらく引用する必要があるかもしれません$argsし、以下を見たいかもしれません。バッシュFAQ 001使用に関する情報while read...

簡単に言えば、おそらく欲しいでしょう

grep -l "$args" * | while IFS= read -r theFile; do

おすすめ記事