LoginSignup
1
0

More than 1 year has passed since last update.

【じぶんメモ】シェルスクリプトで配列を使ってみる

Last updated at Posted at 2022-03-19

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個という意味

 

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0