Shell Script を書いていてふと引数を全部一気に別のところに渡す方法はないのかなぁと思って調べてみました.
結論だけサクッと知りたい人は 3. 解決法 と 4. まとめ を読んでください.
1. そもそも
引数の数は $#
で取得できて,$1
,$2
とかでそれぞれの引数は取得できるが,これを for ループで回すにも配列のインデックスじゃなくて変数名が何番目の引数かを表しているから扱いに困ってしまったわけです…
つまり,例えば以下のようにしたら$1
,$2
…と表示されるというようなことは当然起こらないし,
#!/bin/bash
for i in `seq 1 $#`
do
echo $i
done
引数は配列に入っているわけではないので,以下のようにアクセスできるわけでもないです.
#!/bin/bash
# args: array
for i in `seq 1 $#`
do
echo ${args[i]}
done
2. 全部の引数を一気に渡したい時って?
例えば,python のコードをいちいち
$ python3 hoge.py
として,実行するのはめんどくさいから hoge
というコマンドにしてしまおうという時などに引数を渡したくなることがあると思います.
3. 解決法
そんな時は
#!/bin/bash
python3 hoge.py $@
とするとシェルスクリプトに渡した引数がそのまま Python に渡されます.$@
が全ての引数を表すわけですね.
つまり,
$ hoge -a -r
などとすると
$ python3 hoge.py -a -r
を実行してくれるわけです.
これで無事 Shell Script を通して,全ての引数をそのまま渡すことができました
4. まとめ
まとめに入ってからいうのもあれなんですが,よく考えるとこんな簡単なコードなら以下のように alias
を貼るだけでもいい気がしてきましたね…
$ alias hoge='python3 hoge.py'
これを .bash_profile
なり.bash_aliases
なりに入れておくと terminal を立ち上げるたびに自動で使えるようになります.
色々解決法はあると思うので,自分の好みのものを使ってください.