このページの内容は古すぎるので,新しい記事を用意しました
http://d.hatena.ne.jp/pyopyopyo/20180426/p1
複雑な shell script を書くためには,コマンドライン引数の構文解析が必要不可欠.そこで,bash上でgetoptを使ってコマンドライン引数を解析する方法について調べてみた.
getopt の仕様はヤヤコシイ.まずは実際に動かしてみる.
$ getopt ab "-ab hoge" -a -b -- fuga
このように,getopt は二つの引数をとる.一つ目の引数はオプション文字からなる文字列.上記の例では"ab"であり,オプションとして"-a"と"-b"を受け付けることを示す. 二つ目の引数は解析するコマンドライン引数の文字列である.
getopt の動作としては,まずコマンドライン引数を
- "-"から始まるオプション文字
- それ以外の要素
の二つの部分に分割し,次に分割した結果を並び替えて"オプション要素 -- それ以外の要素" の形で出力する.
またオプション文字の後ろにコロン: が付いている場合は,オプションに引数が必要であることを示す.たとえば "-b" オプションが引数を取る場合は,以下のようになる.
$ getopt ab: "-ab hoge" -a -b fuga --
以上をふまえると, getopt の使い方は,だいたい以下のようになる.
#!/bin/bash function usage() { echo "usage:" echo "$0 [opt] [argument]" echo " -a" echo " -b=VALUE" echo " -c" exit -1 } OPT=`getopt "hab:c" $@` || usage set -- $OPT while [ -- != "$1" ]; do case $1 in -h) usage ;; -a) a=1 ;; -b) b=$2; shift ;; -c) c=1 ;; esac shift done ## "--" を取り除く shift ## オプションの値を表示 echo "a:=$a b:=$b c:=$c" ## 残りのコマンドライン引数を表示 while [ -n "$1" ]; do echo $1 shift done
$ ./fuga.sh aaa -a bbb a:=1 b:= c:= aaa bbb
解ってしまえば簡単.