Alfredのワークフローで遊んでいます。スクリプトにzshを利用しているのですが、シェルスクリプト初心者なので自分のためにメモを残します
シェルスクリプトで配列を使ってみる
シェルスクリプトでは1次元配列のみサポートしていて、添字はブラケットで囲みます
変数名[添字]
※zshは添字は1から始まります
配列に値をセットする
添字をひとつずつ指定してセットできるのは当たり前ですね
array[1]=One; array[2]=Two; array[3]=Three
区切り文字(空白)を利用して一括でセットすることもできます
array=(One Two Three)
セットした値をエコーしてみましょう
array=(One Two Three); for x in {1..3}; do echo 'array['$x']='$array[x]; done
#=> array[1]=One
#=> array[2]=Two
#=> array[3]=Three
たしかにセットできていますね
上の例では、括弧の中に実際の文字列を指定していますが、変数で指定することもできます
下記のようにechoを利用している部分が味噌です
# 変数をechoして配列にセット
str='One Two Three'; array=(`echo $str`);for x in {1..3}; do echo 'array['$x']='$array[x]; done
#=> array[1]=One
#=> array[2]=Two
#=> array[3]=Three
ファイルを1行ごとに配列へ格納することもできます
# ファイルをcatして配列にセット(下のサンプルはtemp.txtを出力して開きます)
echo -e 'One\nTwo\nThree' > temp.txt;array=(`cat temp.txt`);for x in {1..3}; do echo 'array['$x']='$array[$x]; done; open temp.txt
#=> array[1]=One
#=> array[2]=Two
#=> array[3]=Three
# 空白がある場合は、区切り文字(IFS)を改行('\n')にすればOKです(下のサンプルはtemp2.txtを出力して開きます)
echo -e 'One 1\nTwo 2\nThree 3' > temp2.txt;OLD=$IFS;IFS=$'\n';array=(`cat temp2.txt`);IFS=$OLD;for x in {1..3}; do echo 'array['$x']='$array[$x]; done; open temp2.txt
array[1]=One 1
array[2]=Two 2
array[3]=Three 3
# ちなみにIFSの中身を確認するには下記です。あ、複数設定できるのですね
echo -n $IFS | od -ac
#=> 0000000 sp ht nl nul
#=> \t \n \0
#=> 0000004
# SPace(空白)、Horizontal Tab(タブ)、New Line(改行)、Null(ヌル)
配列へのアクセス(なかば実験室です)
個々の要素を参照するには添字に数字を指定します
1個目が1、2個目が2、3個目が3・・・・
マイナスも指定することができ、その場合配列の最後からの順番となります
-1は最後の項目、-2は最後から2番目、-3は最後から3番目・・・・
# 2番目をエコー
array=(One Two Three Four Five);echo $array[2]
#=> Tow
# 後ろから2番目をエコー
array=(One Two Three Four Five);echo $array[-2]
#=> Four
配列全体は添字なし、添字*、添字@のどれでもいけますね
全体をエコーすると空白で区切られて出力されます
# 配列全体のアクセス 添字なし、添字*、添字@のどれでもOK
array=(One Two Three); echo $array; echo $array[*]; echo $array[@]
#=> One Two Three
#=> One Two Three
#=> One Two Three
配列を部分的に参照する場合、連続した要素の取り出しが可能で
数字を2つ使って初めと終わりを指定ます
もちマイナスも可能
# 2番目から末尾2番目までをエコー
array=(One Two Three Four Five);echo $array[2,-2]
#=> Two Three Four
# 逆順は不可ですね
array=(One Two Three Four Five);echo $arrayE[2,1]
# 実質1項目の指定も可能。2番目から2番目まで
array=(One Two Three Four Five);echo $array[2,2]
#=> Two
# 実質1項目の指定も可能。3番目から末尾3番目まで
array=(One Two Three Four Five);echo $array[3,-3]
#=> Three
配列の要素の個数は、中括弧と#(ナンバー記号)で記述します
# 配列の要素数
array=(One Two Three); echo ${#array},${#array[*]},${#array[@]}
#=> 3,3,3
雑談(変数と配列)
中括弧と言えば、変数の一部を切り取るパラメータ展開で利用しましたね
配列と一般変数の中括弧を比較してみました
似ているような、似ていないような。。。
# 変数の部分参照と配列の要素範囲の指定は似ている?
var=ABCDE; echo ${var:1:3}
#=> BCD
#=> 変数の一部切り取り
array=(A B C D E); echo ${array[2,4]}
#=> B C D
#=> 配列なので空白区切り
# ナンバー記号(#)は変数だと文字列長、配列だと要素数
var=ABCDE; echo ${#var}
#=> 5
#=> 5文字という意味
array=(A B C D E); echo ${#array}
#=> 5
#=> 5個という意味
↧