スイッチケースが変数を受け取らない

スイッチケースが変数を受け取らない

スクリプトには次のスイッチ ケースがあります。

while [ $# -gt 0 ] ; do
  case "$1" in
    -f|--file)
      shift
      f=$1
      ;;
    -s|--string)
      s=$2
      shift
      ;;
    -c|--client)
      c=$3
      shift
      ;;
    -h|-help)
      _usage
      ;;
    -*)
      _usage
    ;;
  esac
 shift
done

しかし、これを実行すると、-c渡した文字列が渡されることはありません。常に空白です。最初の 2 つの変数 (つまり -f と -s) が渡されるのに、なぜそうなるのかわかりません。なぜこのようなことが起こるのか、誰かアドバイスをいただけますか?

ybdemo が -c に渡されることを想定して、以下を実行します。

./find_prod_andfix.sh -f /etc/bar/active_clients -s foo -c "ybdemo"

Mon Aug 27 14:51:22 EDT 2018 find_prod_andfix.sh 11351 INFO: /etc/bar/active_clients
Mon Aug 27 14:51:22 EDT 2018 find_prod_andfix.sh 11351 INFO: foo
Mon Aug 27 14:51:22 EDT 2018 find_prod_andfix.sh 11351 INFO:
Mon Aug 27 14:51:22 EDT 2018 find_prod_andfix.sh 11351 INFO: Checking -- Client ID:

スクリプト内で上記の情報を繰り返す箇所は次のとおりです。

if [[ -z $c ]]; then
    _info ${f}
    _info ${s}
    _info ${c}
    _info "Checking ${line} --  Client ID: ${CLIENT_ID}"
fi

どのようなご提案でも大変助かります。

答え1

あなたは の使い方で自分自身を出し抜いていますshift:

while [ $# -gt 0 ] ; do
  case "$1" in
    -f|--file)
      f="$2" # Re-ordered for consistency
      shift
      ;;
    -s|--string)
      s="$2"
      shift
      ;;
    -c|--client)
      c="$2"   # this was $3, which was the error
      shift
      ;;
    -h|-help)
      _usage
      ;;
    -*)
      _usage
    ;;
  esac
 shift
done

関連情報