シェル スクリプトが期待どおりにファイルを読み取らない

シェル スクリプトが期待どおりにファイルを読み取らない

以下は実行しようとしているスクリプトです:

read n
for ((i=1;i<=$n;i++))
do
file=createserver"$i".json
echo $file
instanceid[$i-1]=$(jq -r '.instance.id' ./$file)
echo $instanceid
done

$file には正しい値が表示されます。ただし、$instanceid は正しくありません。出力は次のようになります。

createserver1.json
a5a485df-b2e8-4467-9144-d012d96d0305
createserver2.json
**a5a485df-b2e8-4467-9144-d012d96d0305**

上記の太字部分は予想通りではありません。インスタンス ID が存在するものとしてキャプチャされた 2 つのファイルとその内容は次のとおりです。

{"instance":{"id":"a5a485df-b2e8-4467-9144-d012d96d0305","os":"Ubuntu 18.04 LTS x64"}}
{"instance":{"id":"4a8ebe11-be1c-45f9-a82c-c41113ecd3a5","os":"Ubuntu 18.04 LTS x64"}}

ファイルの内容が異なる場合、スクリプトは常に最初のファイル自体の内容を取得するのはなぜですか。何か見落としているのでしょうか? ご指導ください。

答え1

試すことができる 2 つの方法:

read n
for ((i=1;i<=$n;i++))
do
file=createserver"$i".json
echo $file
instanceid[$i-1]=$(jq -r '.instance.id' ./$file)
echo ${instanceid[$i-1]}
done

または

read n
for ((i=1;i<=$n;i++))
do
file=createserver"$i".json
echo $file
instanceid[$i-1]=$(jq -r '.instance.id' ./$file)
done
for i in ${!instanceid[@]}; do echo ${instanceid[$i]}; done

関連情報