如何使用“for .. in”循环

如何使用“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 0continue

为了确保你的 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返回循环顶部并读取下一行。

第二个问题是:
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”

相关内容