bashでgetoptsを使用する方法の例 質問する

bashでgetoptsを使用する方法の例 質問する

myscript次のようにファイルを呼び出します:

$ ./myscript -s 45 -p any_string

または

$ ./myscript -h  #should display help
$ ./myscript     #should display help

私の要件は次のとおりです:

  • getoptここで入力引数を取得します
  • 存在するかどうか確認し-s、存在しない場合はエラーを返す
  • の後の値が-s45か90か確認する
  • -p存在し、その後に入力文字列があることを確認してください
  • ユーザーが入力した場合./myscript -h./myscriptまたはヘルプを表示する場合

これまで試したコードは次のとおりです:

#!/bin/bash
while getopts "h:s:" arg; do
  case $arg in
    h)
      echo "usage" 
      ;;
    s)
      strength=$OPTARG
      echo $strength
      ;;
  esac
done

しかし、そのコードではエラーが発生します。Bash でこれを実行するにはどうすればよいですかgetopt?

ベストアンサー1

#!/bin/bash

usage() { echo "Usage: $0 [-s <45|90>] [-p <string>]" 1>&2; exit 1; }

while getopts ":s:p:" o; do
    case "${o}" in
        s)
            s=${OPTARG}
            ((s == 45 || s == 90)) || usage
            ;;
        p)
            p=${OPTARG}
            ;;
        *)
            usage
            ;;
    esac
done
shift $((OPTIND-1))

if [ -z "${s}" ] || [ -z "${p}" ]; then
    usage
fi

echo "s = ${s}"
echo "p = ${p}"

実行例:

$ ./myscript.sh
Usage: ./myscript.sh [-s <45|90>] [-p <string>]

$ ./myscript.sh -h
Usage: ./myscript.sh [-s <45|90>] [-p <string>]

$ ./myscript.sh -s "" -p ""
Usage: ./myscript.sh [-s <45|90>] [-p <string>]

$ ./myscript.sh -s 10 -p foo
Usage: ./myscript.sh [-s <45|90>] [-p <string>]

$ ./myscript.sh -s 45 -p foo
s = 45
p = foo

$ ./myscript.sh -s 90 -p bar
s = 90
p = bar

おすすめ記事