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つずつ対応しているので、簡単だと思うので、お好きに変えてください。
また、値は数値だけでなくて、文字列でもいけるので、汎用性は高いはずです。(ファイルパスなども可能)
0 件のコメント:
コメントを投稿