見つからず、誤った交換エラー

見つからず、誤った交換エラー

これは、ユーザーが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

関連情報