BASH에서 합산 ​​후 출력 결과에 문제가 있습니다.

BASH에서 합산 ​​후 출력 결과에 문제가 있습니다.

while 루프와 If 문을 사용하여 1과 0만 저장한 다음 어느 것이 다른 것보다 더 인기가 있는지 확인해야 합니다. 스크립트를 실행하려고 할 때 문제가 있습니다.

입력하다:

bash vote.sh 1 0 1

산출:

vote.sh: line 18: syntax error near unexpected token `done'
vote.sh: line 18: `done'

세게 때리다암호

#!/bin/bash
zeroSum=0
oneSum=0
while read num do
        if [ num -eq  0 ]; then
                zeroSum=$zeroSum+num
        elif [ num -eq 1 ]; then
                oneSum=$oneSum+num
        else
                echo only 0s and 1s are accepted
        if [ zeroSum -gt oneSum ]; then
                echo zero won: $zeroSum
        elif [ oneSum -gt zeroSum ]; then
                echo one won: $oneSum
        else
                echo it was a draw
        fi
done

답변1

코드에 몇 가지 구문 오류가 있습니다.

가장 먼저 트리거되는 것은 ;루프 헤더에서 이전에 누락된 부분입니다. 이 문제를 해결하면dofor

while read num; do

fi첫 번째 문도 누락되었습니다 if. 이 문제를 해결하세요:

if [ num -eq  0 ]; then
        zeroSum=$zeroSum+num
elif [ num -eq 1 ]; then
        oneSum=$oneSum+num
else
        echo only 0s and 1s are accepted
fi

현재 코드달리다, 그러나 여러 변수 확장을 추가하는 것을 잊었으므로 $실행 중인 스크립트에 데이터를 입력하기 시작하면 더 많은 오류가 발생합니다.

이 문제를 해결하세요:

#!/bin/sh

zeroSum=0
oneSum=0

while read num; do
        if [ "$num" -eq  0 ]; then
                zeroSum=$(( zeroSum+1 ))
        elif [ "$num" -eq 1 ]; then
                oneSum=$(( oneSum+1 ))
        else
                echo only 0s and 1s are accepted
        fi

        if [ "$zeroSum" -gt "$oneSum" ]; then
                echo "zero won: $zeroSum"
        elif [ "$oneSum" -gt "$zeroSum" ]; then
                echo "one won: $oneSum"
        else
                echo it was a draw
        fi
done

여기에 몇 가지 변경 사항을 적용했습니다.

  1. 스크립트는 수행할 수 없는 내용을 포함하지 않기 때문에 /bin/sh가 아닌 에 의해 실행됩니다.bashsh
  2. 변수 확장은 $변수 이름 접두사로 작성되며,그리고 큰따옴표.
  3. 산술 확장은 다음과 같이 작성됩니다 $(( ... )). 산술 확장에 사용되는 변수는 $변수 앞에 올 필요가 없습니다 .
  4. zeroSum아마도 변수 sum을 oneSum1 씩 증가 시키려고 했을 것 입니다 $num.

그러나 그것은 여전히 ​​별로 의미가 없습니다. 모든 반복에서 승자를 선언하는 이유는 무엇입니까?

또한 이 질문에서는 스크립트의 표준 입력 스트림이 아닌 명령줄에 입력을 제공하는 것으로 보입니다.

나는 다음과 같은 것을 쓸 수도 있습니다

#!/bin/sh

unset s0 s1

for arg do

        case $arg in
                0) s0=$(( s0 + 1 )) ;;
                1) s1=$(( s1 + 1 )) ;;
                *) printf 'Expecting 0 or 1 only, got "%s"\n' "$arg" >&2
        esac

done

if [ "$s0" -gt "$s1" ]; then
        printf 'Zeros won with %d against %d\n' "$s0" "$s1"
elif [ "$s0" -lt "$s1" ]; then
        printf 'Ones won with %d against %d\n' "$s1" "$s0"
else
        echo 'It is a draw'
fi

여기서 루프는 지정된 명령줄 인수를 반복하고 완료되면 if최종 문에서 결과를 인쇄합니다.

루프 내부에서는 긴 -- 문 보다 더 간결한 case ... esac문(switch 문과 비슷함)을 사용했습니다.ifthenelse

시험:

$ sh script 0 1 1 0 0 0
Zeros won with 4 against 2
$ sh script 1 2 1 0 0 1
Expecting 0 or 1 only, got "2"
Ones won with 3 against 2

관련 정보