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

행 중 하나가 알파벳 순서로 된 횟수를 계산하는 스크립트를 만들었습니다. 그러나 어떤 이유에서인지 에코는 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문자를 "수직으로" 배치하면
  • 따라서 원본은 $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" ]

이제 이것이 더 합리적인 비교가 될 것입니다.

잘못된 변수

하지만 이 문제를 해결하더라도 게시한 스크립트에는 두 번째 문제가 있습니다. 즉, 코드 본문에 다음과 같은 내용이 있다는 것입니다.

count=$((count + 1))

$count하지만 당신은 그것에 대해 전혀 언급하지 않고 다음과 같이 썼다고 말했습니다.

echo "$newCount"

물론 정의 가 없기 때문에 $newCount이것을 호출하면 가치도 없고 아무것도 없으므로 아무것도 얻지 못합니다. 아마도 당신이 원하는 것은 다음과 같습니다:

echo "$count"

따라서 이 두 가지 버그가 해결되었으므로 제공된 코드에서 알 수 있는 한 이제 작동할 것입니다.

관련 정보