シェルスクリプトで、コマンドのオプションを扱う

意外とわからなかったので、メモしておく。


例えばpythonを起動するスクリプトを書くとき

#!/bin/sh
python

とか書けば、シェルからファイル名を叩けば一応起動はするけど、オプションを指定して実行することはできない。
例えば

$ ./test.sh -a

みたいに。


そのように、シェルスクリプトをオプションつけてスクリプトを実行させたい時の対策メモ。


結論から書けば、

#!/bin/sh

python "$@"

と書くと、オプションの構成を変えることなく起動可能。


"" でくくるのは、その中の引数がそのまま入力されるから。


ただし、"$*"の場合オプションを一つとしてまとめて渡してしまうことがあるので、注意が必要。
つまり、くくったときの動作として


  • $@は、いくつかのオプション中に "" でくくられるようなオプションがある場合、くくられた要素を一つとして認識し、その他のオプションはくくられたものとは別に認識する。

  • $*は、いくつかのオプション中に "" でくくられるようなオプションがある場合、いくつかのオプションをすべてまとめて一つと認識する。


  • という違いがある?んだと思う。間違ってたらごめん。


    ちなみに指定するオプションをくくるメリットは、スペースがオプションに反映されること。