これは、ユーザーがn個の数字を入力して、数字が奇数か偶数かを判断するために使用されるスクリプトコードです。しかし、私の配列はうまくいかないようです。
#!/bin/sh
echo "Enter the value of n:"
read n
e=0
o=0
while [ $n -gt 0 ]
do
echo "Enter the number:"
read a
t=`expr $a % 2`
if [ $t -eq 0 ]
then
even[e]=$a
e=`expr $e + 1`
else
odd[o]=$a
o=`expr $o + 1`
fi
n=`expr $n - 1`
done
echo "The even numbers are ${even[*]}"
echo "The odd numbers are ${odd[*]}"
exit 0
次のエラーが発生します。
test.sh: 15: test.sh: odd[o]=1: not found
test.sh: 12: test.sh: even[e]=2: not found
test.sh: 20: test.sh: Bad substitution
エラーはどこにあり、なぜ発生しますか?
答え1
実行中のスクリプトは/bin/sh
配列をまったくサポートしていません。bash
一方、シェルはそうです。
expr
また、算術演算など、やや古い構文を使用しています。
以下は、次のために作成されたスクリプトバージョンですbash
。
#!/bin/bash
read -p 'Enter n: ' n
while (( n > 0 ))
do
read -p 'Enter number: ' a
if (( a % 2 == 0 ))
then
even+=( "$a" )
else
odd+=( "$a" )
fi
n=$(( n - 1 ))
done
echo "The even numbers are ${even[*]}"
echo "The odd numbers are ${odd[*]}"
主な変更点には、算術評価、算術置換、ユーザーへのヒントの提供、配列への要素の追加、不要な変数の削除のための先のとがっ#!
た線修正が含まれます。bash
(( ... ))
$(( ... ))
read -p
+=(...)
コマンドラインから数字を取得するこのスクリプトの非対話型バージョン:
#!/bin/bash
for number do
if (( number % 2 == 0 )); then
even+=( "$number" )
else
odd+=( "$number" )
fi
done
printf 'The even numbers: %s\n' "${even[*]}"
printf 'The odd numbers: %s\n' "${odd[*]}"
テスト:
$ bash script.sh 1 2 3 4
The even numbers: 2 4
The odd numbers: 1 3