情况如下: 我有一个 .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"
因此,随着这两个错误的解决,据我从提供的代码来看,它现在应该可以工作了。