シェルスクリプトで、ある順番以降の引数を取得する


……の前に、前提から。

特定の順番にある引数を取得する

${n}を使います。

test.sh
#!/bin/sh

echo $0
echo $1
echo $2

実行結果:

$ ./test.sh foo bar baz
./test.sh
foo
bar

$0がプログラム名になる。上記の場合、baz$3なので出力されない。

引数を全部取得する

$@を使います。

test.sh
#!/bin/sh

echo $@

実行結果:

$ ./test.sh foo bar baz
foo bar baz

ある順番のもの以降を全部取得する

これが本題です。たとえば、引数の3番目以降を全部取得したい場合。

test.sh
#!/bin/sh

echo ${@:3:($#-2)}

実行結果:

$ ./test.sh 1 2 3 4 5
3 4 5

$#には、引数の数が格納されています。なので、この場合は3番目以降の全部なので、全体の数から、いらない2つを引いているわけです。

てか、↑をやんなくても、3番目以降「全部」なら${@:3}でもよかった。つまり、開始の順番だけでよい。3番〜5番目とかなら「3番目以降の3つ」という意味で${@:3:3}と書く必要がある。

応用例として、2個の引数のあと、--以降にオプションとして解釈されたくない文字列がある場合、以下のように書けます。

test.sh
#!/bin/sh

echo $1
echo $2
echo ${@:4:($#-2)}

実行結果:

$ ./test.sh hoge fuga -- --foo bar --baz qux
hoge
fuga
--foo bar --baz qux

参考文献