#!/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
返回循环顶部并读取下一行。
第二个问题是:
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”