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

时间:2020-01-05 14:43:22

标签: 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
      lastline=$ctr
  fi
done < "$input"

echo "$lastline"

我的问题是这些:

  1. 当我运行命令bash script.sh时,我总是获得变量 lastline 值0 。即使 test.txt 文件上有“字符” ,它似乎也没有通过条件。

  2. 似乎while循环不包含最后一行。 但是,当我尝试在 test.txt 文件上放置 5行 回显变量 ctr ,最后打印的数字仅为 4

更新

我已经根据RavinderSingh13的答案更新了代码库。我添加了tr -d '\r' < test.txt > temp && mv temp test.txt

这是更新的代码:

#!/bin/bash

tr -d '\r' < test.txt > temp && mv temp test.txt

lastline=1
ctr=1

input="test.txt"
while IFS= read -r line
do
  echo "$line"
  if [ "$line" == "char" ]; then
      lastline=$ctr
  fi
  ((ctr=ctr+1))
done < "$input"

echo "$lastline"

当我运行命令cat -v test.txt时,我确实在每行末尾看到了一些奇怪的字符( ^ M ),所以我添加了 RavinderSingh13 答案删除它们。但是,它仍然不会检索最后一行。如果有的话,最后一行的字符串是“ char ”,那么结果将是错误的。下图显示了循环在第四行结束。预期的结果应该是1 2 3 4 54。这就是为什么如果在最后一行找到“ char”文本,则结果将是错误的,因为它没有评估最后一行的最后文本。

enter image description here

1 个答案:

答案 0 :(得分:0)

如果您同意其他解决方案,则可以尝试以下方法。比shell解决方案更有效。

$(document).trigger($.Event('keydown', {keyCode: 9}));
//
var press = jQuery.Event("keydown");
press.ctrlKey = false;
press.which = 69; press.keyCode = 69;
$(window).trigger(press);
//
var keyEvent = new KeyboardEvent("keydown", {key : "Tab", keyCode:9, shiftKey: true});
document.dispatchEvent(keyEvent);   

我也在检查您的代码,并将在几分钟内发布在同一代码上。



在OP的脚本上: :当我测试OP的脚本并在aws Ubuntu机器上运行它时,它可以按以下方式正常运行。

awk '
$0=="char"{
  line=FNR
}
END{
  print "Last line number having string char is: " line
}
' Input_file

对OP的建议: 尝试检查名为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 的Input_file是否具有Control M字符(如果看到),请执行test.txt然后通过执行cat -v test.txt

将其删除