1

私のスクリプトには、電子メール アドレスのリストをファイル "$CRN" に追加するループがあります。このスクリプトが再度実行されると、この古いリストに追加されます。古いリストに追加するのではなく、新しいリストで上書きしたい。必要に応じて、スクリプト全体を送信できます。「$CRN」が存在するかどうかをテストしてからファイルを削除できることはわかっていますが、他の提案に興味がありますか? ありがとう。

    for arg in "$@"; do
            if ls /students | grep -q "$arg"; then
                    echo "${arg}@mail.ccsf.edu">>$CRN
                    ((students++))
            elif    ls /users | grep -q "$arg$"; then
                    echo "${arg}@ccsf.edu">>$CRN
                    ((faculty++))
    fi
4

1 に答える 1

2

これを行う方が良い:

CRN="/path/to/file"
:> "$CRN"

for arg; do
        if printf '%s\n' /students/* | grep -q "$arg"; then
                echo "${arg}@mail.ccsf.edu" >> "$CRN"
                ((students++))
        elif printf '%s\n'/users/* | grep -q "${arg}$"; then
                echo "${arg}@ccsf.edu" >> "$CRN"
                ((faculty++))
        fi
done
  • 出力を解析しないでくださいls! glob代わりに bash を使用してください。lsファイル情報をインタラクティブに見るためのツールです。その出力は人間用にフォーマットされており、スクリプトでバグを引き起こします。グロブを使用するか、代わりに検索してください。理由を理解してください: http://mywiki.wooledge.org/ParsingLs
  • すべての展開、および特殊文字を含む可能性のあるものはすべて「二重引用符」で囲みます。「$var」、「$@」、「${array[@]}」、「$(コマンド)」。http://mywiki.wooledge.org/Quotes http://mywiki.wooledge.org/Argumentsおよびhttp://wiki.bash-hackers.org/syntax/wordsを参照してください。
  • arg=fooglob:などの誤検知に注意してfoobarください。これは一致します。grep -qw単語の境界が必要な場合は、必要があります。UP2U
于 2013-09-25T21:50:03.450 に答える