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