読者です 読者をやめる 読者になる 読者になる

はわわーっ

はわわわわっ

[bash] コマンドの引数を配列にする

コマンドの引数を全部まとめて配列にいれたいときは

a=($@)

みたいにやればいいので簡単にできる。ただ、この方法だと引数の一部を配列にしたい時とか配列を複数わたしたい時とかに困る。いろいろ試行錯誤しながらこんな感じのfunctionにしてみた。

function argarray() {
  begin=$1
  size=$2
  end=$(expr $begin \+ $size)
  shift 2
  i=$begin
  while test $i -lt $end; do
    eval echo \$$i
    i=$(expr $i \+ 1)
  done
}

引数に配列の先頭の引数の位置と配列のサイズを指定する。これで

#!/bin/bash

source argarray.sh

aa=($(argarray 2 5 $@))
echo ${aa[@]}

こんなスクリプトを実行してみると

% ./array.sh aaa 1 2 3 4 5 hoge fuga piyo
1 2 3 4 5

引数の2番目から5つ分(例では1 2 3 4 5)が配列aaに入る。
引数に複数の配列を渡したいときには

#!/bin/bash

source argarray.sh

a1=($(argarray 1 5 $@))
shift 5
a2=($(argarray 1 3 $@))
echo ${a1[@]}
echo ${a2[@]}

こうすると

% ./argarray.sh 1 2 3 4 5 hoge fuga piyo   
1 2 3 4 5
hoge fuga piyo

ちゃんとa1に1 2 3 4 5が、a2にhoge fuga piyoが入っている。

まぁ、一応動作はしてるけどもっと簡単にやる方法があると思うので、知っている方教えてください。