[スニペット] shellで受け渡しの引数をkey、valueで行うようにする

2015年11月12日

Shell テクノロジー プログラミング

Shellで便利ツールを作成する時に、汎用性を持たせるために、コマンドラインでの引数を受け付けられるようにしたいが、引数の何番目という風にしてしまうと、ブランクが発生した時にnullは受け渡せないので(文字列で強制的に行えばできなくないのだが・・・)、ツールの柔軟性を大幅に増したいのでkey、value形式で受け取れるスニペットを作ってみた。

仕様

実行したプログラムで基本数値に対して、足し算値と引き算値を受け取って結果を出してみる。
基本値:100 足し値:20 引き値:5

プログラム

#!/bin/sh BASIC=`echo $@|awk -F" " '{for(i=1;i<=NF;i++){if($i=="--basic"&&$(i+1)!~/^--/){print $(i+1);}}}'` ADD=`echo $@|awk -F" " '{for(i=1;i<=NF;i++){if($i=="--add"&&$(i+1)!~/^--/){print $(i+1);}}}'` SUB=`echo $@|awk -F" " '{for(i=1;i<=NF;i++){if($i=="--sub"&&$(i+1)!~/^--/){print $(i+1);}}}'` echo $((BASIC + ADD - SUB))

実行

$ sh calc.sh --basic 100 --add 20 --sub 5 > 115 無事に上記のような結果が出たら、他の値も試してみよう $ sh calc.sh --basic 200 --add 50 --sub 125 > 125 $ sh calc.sh --basic10 --add 20 --sub 30 > -10 $ sh calc.sh --basic10.0 --add 1.2 --sub 0.6 > calc.sh: line 7: 10.0: syntax error: invalid arithmetic operator (error token is ".0") マイナスにも対応できてますね。 でも小数点には対応できていません。 小数点は別の方法で対応する必要がありますね。 でも、今回は、引き渡し値のkey,valueなので無視します。

解説と改造ポイント

受け渡し値"$@"をfor文で順番に調べて、対象のkey値の次の値を拾うようにしています。 また、値にマイナスが入った時の区別の為に--basicという風にしています。 --**というkey値を改造することで何にでも対応できるようになります。 1つずつ対応しているので、簡単だと思うので、お好きに変えてください。 また、値は数値だけでなくて、文字列でもいけるので、汎用性は高いはずです。(ファイルパスなども可能)

このブログを検索

ごあいさつ

このWebサイトは、独自思考で我が道を行くユゲタの少し尖った思考のTechブログです。 毎日興味がどんどん切り替わるので、テーマはマルチになっています。 もしかしたらアイデアに困っている人の助けになるかもしれません。