自分自身のメモ用に、シェルスクリプトでオプションをパースするコードをメモにします。
option.sh
#!/bin/bash
parse_option () {
if [ $1 = "h" ];then
echo "Usage: option.sh [OPTIONS] ..."
echo
echo "Options:"
echo " -h"
echo " -a"
echo " -b"
echo " -c"
echo
exit 1
fi
if [ $1 = "a" ];then
echo "a option is ${@:2:($#-1)}"
fi
if [ $1 = "b" ];then
echo "b option is ${@:2:($#-1)}"
fi
if [ $1 = "c" ];then
echo "c option is ${@:2:($#-1)}"
fi
}
commands=$@
echo $commands | tr '-' '\n' | sed '/^$/d' | while read line
do
parse_option $line
done
ここにコマンドでbash option.sh -a hoge -c fuga -b piyo
ってうつと
a option is hoge
c option is fuga
b option is piyo
ってなります。
簡単な説明
commandsに引数全て渡して、オプションはハイフンから始まる事を使って、trでハイフンを改行に変えてます。
一番最初のオプションのハイフンも改行コードになって、空行が上に入ってしまうのでsedで除去しています。
その結果をwhileで改行毎にループ処理をして、parse_optionが呼ばれます。引数は1行毎に与えられます
ハイフンで区切ってるので、関数に渡る一番最初の引数はオプション名になります。その後ろはオプションに渡す引数になるので${@:2:($#-1)}
で2つ目以降の引数を受け取ります。
出来ること
オプションの複数指定
オプションのあと付けc
parse_option内で${@:2:($#-1)}
を$2
にすることでイチオプションに対して値を一つのみに出来る。${@:2:($#-1)}
の使いみちは-name alice bob carol
のようなとき。
出来ないこと
-ab
のようなオプションの併記
--A
のようなロングオプション
もっと厳密にオプションをパースしたい場合
こちらの記事を参照
bash によるオプション解析