Shellスクリプトでn番目以降の引数全てを取得する

Shellスクリプトで、第一番目の引数だけを消費して、残りの引数はその先のプログラムに渡したい、とかそういうときに使えます。

drop2() {
  echo ${@:3}
}

drop2 1 2 3 4 5 6
# -> "3 4 5 6"と表示される

要するに、N番目以降の引数全てを取得したいときは、${@:N}とすればよい、ということになります。

番外編

N番目以降、M個の引数を取得したいときは、${@:N:M}とすればよいようです。

drop2take3() {
  echo ${@:3:3}
}

drop2take3 1 2 3 4 5 6
# -> "3 4 5"と表示される

これを応用すると、N番目からM番目までの引数を取得したいときには、以下のようになるでしょう。

take3to6() {
  echo ${@:3:(6-3)}
}

take3to6 1 2 3 4 5 6
# -> "3 4 5"と表示される

また、これには変数が使えるので、

N=3
M=6

takeNtoM() {
  echo ${@:$N:($M-$N)}
}
takeNtoM 1 2 3 4 5 6
# -> "3 4 5"と表示される

という使い方もイケますね。

参考