mapfileを使用して値を読み取ると、bash配列は正しく処理されません。

mapfileを使用して値を読み取ると、bash配列は正しく処理されません。

これは私を混乱させる。

bash配列のロードには2つのバージョンがありますが、1つは機能し、もう1つは機能しません。

スクリプトで配列を明示的に初期化すると正常に動作します。

zz=( 1 26 32 54 71 13 30 43 52 73 7 23 42 57 61 15 27 35 56 66 5 20 36 51 68 )

#print in reverse
for i in {24..0}
do
        echo "zz[$i] is ${zz[$i]}"
done

出力は予想通りです。

zz[24] is 68
zz[23] is 51
zz[22] is 36
zz[21] is 20
zz[20] is 5
zz[19] is 66
zz[18] is 56
zz[17] is 35
zz[16] is 27
zz[15] is 15
zz[14] is 61
zz[13] is 57
zz[12] is 42
zz[11] is 23
zz[10] is 7
zz[9] is 73
zz[8] is 52
zz[7] is 43
zz[6] is 30
zz[5] is 13
zz[4] is 71
zz[3] is 54
zz[2] is 32
zz[1] is 26
zz[0] is 1

このバージョンは(まだ)動作しません:

# cat your_data
1 26 32 54 71 13 30 43 52 73 7 23 42 57 61 15 27 35 56 66 5 20 36 51 68
mapfile -t zz < your_data

#print in reverse
for i in {24..0}
do
        echo "zz[$i] is ${zz[$i]}"
done


Output:
zz[24] is
zz[23] is
zz[22] is
zz[21] is
zz[20] is
zz[19] is
zz[18] is
zz[17] is
zz[16] is
zz[15] is
zz[14] is
zz[13] is
zz[12] is
zz[11] is
zz[10] is
zz[9] is
zz[8] is
zz[7] is
zz[6] is
zz[5] is
zz[4] is
zz[3] is
zz[2] is
zz[1] is
zz[0] is 1 26 32 54 71 13 30 43 52 73 7 23 42 57 61 15 27 35 56 66 5 20 36 51 68

したがって、mapfileを介してデータを読み込むと、すべてのデータがzz [0]に埋め込まれます。 IFS を明示的に空白 ("") に設定した場合も同様です。私はこれがある時点で動作したと確信しているので、おそらくこれは私の環境でも機能します。混乱しています...

ありがとう、スナックスタード

ベストアンサー1

このmapfileコマンドはファイルを 1 行ずつ読み込みます。つまり、ファイルがで終わると予想します\n。データはスペースで区切られているため、ファイル内のこの(唯一の)行は単一のトークンとして扱われ、最初の配列位置に割り当てられます。次のように入力ファイルを変更してみてください。

1
26
32

...

68

トリックが必要です。

おすすめ記事