ファイルに以下のようなbashスクリプトがあり、nepleaks_upd.sh
.bashrcで実行したいと思います./nepleaks_upd.sh bootstrap --branch off
。それを受け入れることはできませんが、うまく--branch
いきます./nepleaks_upd.sh bootstrap -b off
。
usage() { echo "Usage: $0 [prepare | up | down] [-b <on/off>]" 1>&2; exit 1; }
case "$1" in
bootstrap)
while getopts ":b:" o; do
case "${o}" in
b)
b=${OPTARG}
if [ ${b} == "off" ]; then
echo "git clone https://github.com/iPrayag/dotfiles.git"
## logic
fi
;;
*)
echo ${o}
usage
;;
esac
done
shift $((OPTIND-1))
echo "option1 = ${o}"
echo "option2 = ${b}"
if [ -z "${b}" ]; then
usage
fi
;;
up)
echo "up"
##logic
;;
down)
echo "down"
##logic
;;
*)
echo "Usage: $0 {up | down} dev"
exit 1
;;
esac
最初がなければうまくいきますcase .. in .... esac
。の場合はcase ... in ... esac
空のオプションを提供します-b
。
$ ./nepleaks_upd.sh bootstrap -b off
option1 = ?
option2 =
Usage: ./nepleaks_upd.sh [bootstrap | up | down] [-b <on/off>]
答え1
getopts
解析は最初の引数で始まり、オプションではなく最初の引数で停止します。これは標準的なルールです。一部のGNUユーティリティは引数の後にオプションを受け入れますが、通常somecommand foo -bar qux
オプション-bar
として解析されません。
後でオプションの解析を開始するには、bootstrap
それを表示する必要があります。変数をgetopts
使用してOPTIND
場所を覚えてください。OPTIND
値1から始まります。最初のパラメータをスキップするには2に設定します。
case "$1" in
bootstrap)
OPTIND=2
while getopts ":b:" o; do
…
または、shift
すでに処理されているパラメータを使用することもできます。
subcommand=$1; shift
case "$subcommand" in
bootstrap)
while getopts ":b:" o; do
…