"for .. in"ループを使用する方法

#!/bin/bash

if [ ! $# -eq 2 ];
then echo "You have not inputted the correct amound of arguments.
usage: $0 file user
Where file is the file to search
and user is the user to find" 
fi

if [ ! -e $1 ];
then echo "You have inputted an invalid filename.
usage: $  file user
Where file is the file to search
and user is the user to find"
fi

let count=0

for line in `cat $1`; do
count=`expr $count + 1`
if [ "$line" == "$2" ]; then
        echo "$2 found on line: $count"
        exit 0
else
        echo "Would you like to insert this username? y/n"
        read answer
        answer=`echo $answer | tr [a-z] [A-Z]`

    if [ "$answer" != "y" ]; then
            cat "$answer" >> "/classlist.txt"
    else
            echo "That's fine. Program ending ..."
    exit 0
    fi
fi
done

私の「for in」ループは期待どおりの操作を実行しません。ループはテキストファイルからデータを取得します(ただし、テキストファイルは改行で区切られた名前のリストにすぎません)、変数「line」に割り当てます。 「for in」ループが終了したら、テキストファイルの次の行に「line」変数を再割り当てする必要があります。しかし、これは事実ではありません。スクリプトはテキストファイルの最初のデータ項目のみを読み取ります。ループを間違って使用していますか?

ベストアンサー1

短い答え:次にexit 0変更してください。continue

forループが正しく機能していることを確認するには、簡単なテストを実行してください。
count=0 for line in cat $1 do count=expr $count + 1 echo $line done echo "Counted $count lines"

これがファイル内のすべての行に正確な数を提供する場合は、forループが正しく機能するようになります。 (正しいようです。許可されている標準ではありませんが、私自身はこの形式を好みます)

最初の質問は次のとおりです。スクリプトを終了すること
if [ "$line" == "$2" ]; then echo "$2 found on line: $count" exit 0 を意味しますexit 0(つまり、もはや何もしません)。この行は終了するので、ifクリックするとdone次の行の内容を読むことができ、完全に削除できます。または、continueループの一番上に戻って次の行を読むように変更することもできます。

2番目の質問は:
if [ "$answer" != "y" ]; then cat "$answer" >> "/classlist.txt" else echo "That's fine. Program ending ..." exit 0 fi 本当にスクリプトを終了したい場合はexit 0問題にならないということです。ループから離れるにはこれが必要ですbreak。ループの一番上に移動して次の行を読むには、これが必要ですcontinue

ループを終了するさまざまな方法がコードにどのように影響するかを確認するには、スクリプトのecho "Finished loop"末尾にこの行を追加します。breakcontinueおよびオプションを試して、exit 0「Finished Loop」を印刷するオプションを確認してください。

おすすめ記事