#!/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"
末尾にこの行を追加します。break
、continue
およびオプションを試して、exit 0
「Finished Loop」を印刷するオプションを確認してください。