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

行の1つがアルファベット順になった回数を数えるスクリプトを作成しました。しかし、何らかの理由でエコーはゼロではありません。

スクリプト:

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

実際には2つの異なる問題があり、どちらもエコー結果が発生しない可能性があります。

詳細は次のとおりです。

悪い比較

あなたは次のように書きました:

alphabeticSorted=$(echo $line | grep -o . | sort)
if [ "$line" == "$alphabeticSorted" ]
  • grep -o各一致を別々の行に入れます。
  • .単一文字の一致
  • 元の行に水平文字があります。
  • しかし、grep -o文字を「垂直に」配置すると
  • したがって、オリジナルは$linegrep以降の行と決して同じではありません。

たとえば、コマンドプロンプトで次のことをテストできます。

$ 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" ]

今これはより合理的な比較になります。

無効な変数

ただし、この問題を解決しても、公開したスクリプトには2番目の問題があります。つまり、コード本文に次のような内容があるということです。

count=$((count + 1))

$countしかし、あなたはそれについて全く言及せず、次のように書いたと言いました。

echo "$newCount"

もちろん、定義がないので、$newCountこれを呼び出すと価値もなく、何もないので何も得られません。おそらくあなたが望むものは次のとおりです。

echo "$count"

したがって、これら2つのバグが修正されたので、提供されたコードでわかる限り、これはうまくいきます。

関連情報