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
코드에 몇 가지 구문 오류가 있습니다.
가장 먼저 트리거되는 것은 ;
루프 헤더에서 이전에 누락된 부분입니다. 이 문제를 해결하면do
for
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
여기에 몇 가지 변경 사항을 적용했습니다.
- 스크립트는 수행할 수 없는 내용을 포함하지 않기 때문에
/bin/sh
가 아닌 에 의해 실행됩니다.bash
sh
- 변수 확장은
$
변수 이름 접두사로 작성되며,그리고 큰따옴표. - 산술 확장은 다음과 같이 작성됩니다
$(( ... ))
. 산술 확장에 사용되는 변수는$
변수 앞에 올 필요가 없습니다 . zeroSum
아마도 변수 sum을oneSum
1 씩 증가 시키려고 했을 것 입니다$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 문과 비슷함)을 사용했습니다.if
then
else
시험:
$ 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