C++ ときどき ごはん、わりとてぃーぶれいく☆

Wonder Rabbit Projectのなかのひとのブログ。主にC++。

/bin/shの任意番目(例えば$argc=2)の引数へさくっとアクセスする方法

/bin/shで任意番目の引数へ、C++のmain関数の引数の定番お約束だったらargv[argc]とかする様にウマイことさっくりアクセスできないのかしら?w?」というお話があってちょっと試してみたら・・・物の見事に一発目に誤答してしまったので正解と共に備忘録。

答え(正解編)

#/bin/sh

argc=2

echo '/bin/shの任意番目(例えば$argc=2)の引数へさくっとアクセスするテスト'
eval echo \$$argc
% ./sh_argv_argc_sample.sh aaa bbb ccc
/bin/shの任意番目(例えば$argc=2)の引数へさくっとアクセスするテスト
bbb

間違い編・w・;

実は之これ最初は`$_$argc`で引っ張れるんとちゃうかなーと思って、それで実際テストしたらなんか取れた気がしたんです。でもその「テスト」がテストになってなかった…。

#/bin/sh
argc=2
echo $_$argc

これに対して、

% ./hoge.sh 1 2 3 4
2

とかテストしちゃってたの。テストになってないというorz

ちなみにこれは、`/bin/sh`の配列変数の実体を考えてこれでいけるんじゃないかなーと試してみた例なのでしたが、そもそも1段階では無理っぽいので、正解編ではeval先生を挟みました。sh的には簡潔になっているけど…sh世界の住人でもない限りにはこれは逆にソースが難読化されている気がするので、素直にshiftで引っ張り回したり、変数への値の有無をチェックしてアクセスしたりする方が保守性の良いスクリプトになる気はします。正解編は一応でけた、くらいで…。