Quantcast
Channel: 配列タグが付けられた新着記事 - Qiita
Viewing all articles
Browse latest Browse all 757

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

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

Viewing all articles
Browse latest Browse all 757

Trending Articles