bash 在 while 循环中向变量添加 1

bash 在 while 循环中向变量添加 1

情况如下: 我有一个 .txt 文件,其中包含一系列字母,所有字母均分开 bij 换行符这是该文件的一小部分:

lrtjxz
lrtjhs
lrtsxv
lrtvsw
lrtywj
lrtyws
lrxwwv
lrvhsx
lryjts
lrytwv
lrzvwj
lzwscr
lzjrww
lzjroj
lzjrvs
lzjrhs
lzojvs

我创建了一个脚本,可以计算其中一行按字母顺序排列的次数。但由于某种原因,它的 echo 甚至不是 0。

脚本:

cat file.txt | while read line
do
alphabeticSorted=$(echo $line | grep -o . | sort)
if [ "$line" == "$alphabeticSorted" ]
then
count=$((count + 1))
fi
done

echo "$newCount"

有谁知道我做错了什么?

答案1

实际上有两个不同的问题,两者都会导致没有回声的结果。

详细信息如下:

不好的比较

你写了:

alphabeticSorted=$(echo $line | grep -o . | sort)
if [ "$line" == "$alphabeticSorted" ]
  • grep -o将每个匹配项放在单独的一行中
  • .匹配单个字符
  • 原行有水平字符
  • 但将grep -o字符“垂直”放置
  • 所以原来的$line永远不会等于 grep 后的行

例如,在命令提示符下您可以测试以下内容:

$ line="abc"

现在看看原文$line包含什么:

$ echo "$line"
abc

现在看看如何grep -o改变它,这基本上就是你的$alphabeticSorted

$echo "$line" | grep -o .
a
b
c

所以请记住你写过这个:

if [ "$line" == "$alphabeticSorted" ]

所以 Bash 实际测试的是:

abc

等于

a
b
c

正如您所看到的,这不是同一件事,因此即使您的原件完全按字母顺序排列,您的if陈述也永远不会正确。$line

我强烈建议将它们设置为相同的方向,要么都是水平的,要么都是垂直的。让我们水平进行,这样你就可以在 Bash 中进行测试

$ line2=$( echo $line | grep -o . | sort | tr -d '\n'

$ echo $line2
abc
  • 我们添加tr命令,-d删除某些内容,以及新行\n
  • 因此$line2是“水平的”,就像$line1

所以在你的原始代码中如果你只是修改它

alphabeticSorted=$(echo $line | grep -o . | sort | tr -d '\n')

if [ "$line" == "$alphabeticSorted" ]

现在应该是一个比较合理的比较了。

错误的变量

但即使你解决了这个问题,你发布的脚本还有第二个问题,那就是你的代码正文中有这个:

count=$((count + 1))

$count但你根本没有提到,你说你写道:

echo "$newCount"

因为没有$newCount定义,当然调用这个的时候,没有值,什么也没有,所以你什么也得不到。您可能想要的是:

echo "$count"

因此,随着这两个错误的解决,据我从提供的代码来看,它现在应该可以工作了。

相关内容