상황은 다음과 같습니다. 일련의 문자가 포함된 .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
문자를 "수직으로" 배치하면 - 따라서 원본은
$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"
따라서 이 두 가지 버그가 해결되었으므로 제공된 코드에서 알 수 있는 한 이제 작동할 것입니다.