これは私を混乱させる。
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
トリックが必要です。