カエル髭男
シェルの第2引数以降をまとめて他のシェルに渡したいなぁ。
みなさんはそんな時ありませんか?
今回はシェルの引数から特定の範囲を抜き出す方法や、シェルの引数操作の基本を紹介したいと思います。
「そんなことはいいから、書き方だけ教えて!」というせっかちさんのためにまず結論から。
${@:2}
第2引数以降はこれであらわすことができます。
それでは続けて引数に対する操作の基本と上記の記述について解説します。
n番目の引数を取得する
n番目の引数を取得するには$nの形式で記述することができます。
引数の1番目から$1、2番目が$2、といった形であらわすことができます。
$0は特殊でプログラム名を返します。
それでは実際に試してみます。
$cat test.sh
#!/bin/bash
echo $0
echo $1
echo $2
$ sh test.sh hoge moge
test.sh
hoge
moge
全ての引数を取得する
指定した全ての引数を取得したい場合は、$@または$*と記述します。
$@と$*では””(ダブルクォート)で囲んだ時の動作が異なります。
それでは実際に試してみます。今回は””では囲いません。
$ cat test.sh
#!/bin/bash
echo $@
echo $*
$ sh test.sh hoge moge poge
hoge moge poge
hoge moge poge
引数の件数を取得する
引数の個数は$#で取得できます。
それでは実際に試してみます。
$ cat test.sh
#!/bin/bash
echo $#
$ sh test.sh
0
$ sh test.sh hoge
1
$ sh test.sh hoge moge
2
指定した範囲の引数を取得する
さて本題です。
シェルの引数から特定の範囲を抽出したい場合は、${@:m:n}の形式で記述できます。
$@は先ほど出てきた全ての引数をあらわす書き方ですね。mとnには数値を指定し、mは取得したい引数の開始位置、nは取得したい引数の個数を指定します。位置は最初の引数が1、最後の引数が$#とあらわすことができます。nは省略可能で、省略した場合は最後の引数まで取得されます。
それでは実際に試してみます。
$ cat test.sh
#!/bin/bash
# 引数の2番目以降を取得する
echo ${@:2}
# 引数の2番目から3つ(2,3,4番目)を取得する
echo ${@:2:3}
# 引数の最後を取得する
echo ${@:$#}
# 引数の2番目から最後から一つ前までを取得する
echo ${@:2:($#-2)}
# 引数の2番目から100個取得する(引数の数が足りない場合は最後まで取得されます)
echo ${@:2:100}
$ sh test hoge moge noge poge soge
moge noge poge soge
hoge moge poge
soge
hoge moge poge
hoge noge poge soge
以上です。
コメント