Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Bash脚本中的While循环和If语句_Bash_Shell - Fatal编程技术网

Bash脚本中的While循环和If语句

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

我有一个名为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
      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