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/shbashsh
  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

おすすめ記事