Bash脚本中的While循环和If语句
我有一个名为test.txt的文件,其中包含以下内容:Bash脚本中的While循环和If语句,bash,shell,Bash,Shell,我有一个名为test.txt的文件,其中包含以下内容: this is the last char another last char very last 我有一个bash脚本(script.sh),其代码如下: #!/bin/bash lastline=0 ctr=0 input="test.txt" while IFS= read -r line do ((ctr=ctr+1)) echo "$ctr" if [ "$line" == "char" ]; then
this is the last
char
another last
char
very last
我有一个bash脚本(script.sh),其代码如下:
#!/bin/bash
lastline=0
ctr=0
input="test.txt"
while IFS= read -r line
do
((ctr=ctr+1))
echo "$ctr"
if [ "$line" == "char" ]; then
lastline=$ctr
fi
done < "$input"
echo "$lastline"
当我运行命令cat-v test.txt
时,我确实在每一行的末尾看到了一些奇怪的字符(^M),所以我添加了RavinderSingh13answer来删除它们。但是,它仍然无法检索最后一行。如果最后一行的字符串是“char”,则结果将是错误的。下图显示循环在第4行结束。预期结果应该是123454。这就是为什么如果在最后一行找到“char”文本,结果将是错误的,因为它没有计算最后一行的最后一个文本
如果您同意另一种解决方案,那么您可以尝试以下方法。这比shell解决方案更有效
awk '
$0=="char"{
line=FNR
}
END{
print "Last line number having string char is: " line
}
' Input_file
我也检查您的代码,并将在几分钟后张贴在同一网站上
关于OP脚本:当我测试OP脚本并在我的aws Ubuntu机器上运行时,它运行良好,如下所示
cat file.ksh
#!/bin/bash
lastline=0
ctr=0
input="test.txt"
while IFS= read -r line
do
((ctr=ctr+1))
### echo "$ctr"
if [ "$line" == "char" ]; then
lastline=$ctr
fi
done < "$input"
echo "$lastline"
./file.ksh
4
cat file.ksh
#!/bin/bash
最后一行=0
ctr=0
input=“test.txt”
而IFS=读取-r行
做
((ctr=ctr+1))
###回音“$ctr”
如果[“$line”==“char”];然后
最后一行=$ctr
fi
完成<“$input”
回显“$lastline”
./file.ksh
4.
对OP的建议:尝试通过执行
cat-v test.txt
检查名为test.txt
的输入文件是否有控制M个字符,如果您看到这些字符,则通过执行tr-d'\r'temp&&mv temp test.txt
关于#2,您的文本文件可能不遵循POSIX惯例,以换行符结尾,因此对read
的调用失败,循环提前终止。此外,如果您的文件有DOS行结尾,那么您认为是char
的行实际上是char\r
。将test.txt
保存为POSIX文本文件应该可以解决这两个问题。我在这个测试文件上运行了这个脚本(是的,unix行结束),得到了应该的序列1 2 3 4 5 4。不可复制:感谢Ravinder的副本。当我运行cat-v test.txt命令时,我确实看到了控件M字符。我用你的代码删除了它们。但是,循环不包括最后一行的字符串/文本。所以,如果最后一行的文本是“char”,那么结果将是错误的。@LouKnowsAllReady,对不起,我不明白如果最后一行是字符串char,为什么结果会是错误的?一旦你删除了控制字符M,你可以运行我的或你的代码来获得行号,请尝试这两种代码,让我知道它是如何运行的?awk命令工作得非常好。我想我应该用这个。对于shell脚本,我不知道为什么,但它跳过了最后一行的文本。因此,对于上面给出的示例文件,文本“very last”不会在循环中计算,就好像它总是停在倒数第二行。例如,如果“最后一个”是“char”,那么当预期值为5.hmmmm时,结果仍然是4。。这很奇怪。为什么我是唯一一个没有得到最后一行的循环。请参阅我的帖子上所附的图片。
cat file.ksh
#!/bin/bash
lastline=0
ctr=0
input="test.txt"
while IFS= read -r line
do
((ctr=ctr+1))
### echo "$ctr"
if [ "$line" == "char" ]; then
lastline=$ctr
fi
done < "$input"
echo "$lastline"
./file.ksh
4