気が向いたら書くやつ

気が向いたら何か書きます

bashでの簡易な引数処理

よく出てくるのでメモ。

$#

実行時に指定された引数の数を取得する。

引数・オプションの有無を判別できます。

# nargs.sh
if [ $# -ne 0 ]; then
    echo "$# options"
else
    echo "no option"
fi

# $ ./nargs.sh 0 1 2
# 3 options
# $ ./nargs.sh
# no option

shift [N]

引数をN個左シフトする(省略時N=1)。 先頭の引数は$1に格納される。

$#shiftwhileforループを組み合わせて、引数を先頭から順番に処理することができます。

# shiftarg.sh
while [ $# -ne 0 ]; do
    echo -n $1
    shift
done

# $ ./shiftarg.sh 0 1 2
# 0
# 1
# 2

caseとの組み合わせ

上記引数の順序処理とcaseによる条件分岐を組み合わせれば、引数・オプションの簡易な解析が可能です。

# parse.sh
while [ $# -ne 0 ]; do
    case $1 in
        -o|--longo)
            shift # オプションつき引数:シフトして次の引数を処理する
            echo "option with argument: "$1
            ;;
        -[Yy])
            echo $1" option"
            ;;
        *)  # 引数:上記オプションにマッチしない
            echo "argument: "$1
            ;;
    esac
    shift
done

# $ ./parse.sh 0 -o 1 --longo 2 -y -Y
# argument: 0
# option with argument: 1
# option with argument: 2
# -y option
# -Y option

エラーや例外の処理までは対処しない方針で、あしからず。