複数の値を持つ Bash キーワード引数

複数の値を持つ Bash キーワード引数

私はこれをシェルスクリプトのキーワード引数を取得するために使用します。

while [[ $# -gt 0 ]]; do
  key="$1"
  case $key in
    -u) 
      USERID="$2"
      shift # past argument
      shift # past value
      ;;
    -n)
      JOBNAME="$2"
      shift # past argument
      shift # past value
      ;;
    -j) 
      job="$2"
      shift # past argument
      shift # past value
      ;;
      *) echo "Improper usage"; exit 1;;
  esac
done

job変数は通常、複数の単語で構成されます。参照にパラメータの合計値を指定すると、正しく機能します。しかし、引用符なしで値を提供しながら、その単一の変数に保存することは可能ですか?たとえば、これはうまくいきます

./myscript -j "my long string"

そしてそれを"my long string"変数に保存しますjob。しかし、私はそれが非常に似たように動作したいと思います。

./myscript -j my long string

ベストアンサー1

残りのパラメータを選択して使用できますが、"$*"実際にはお勧めできません。標準的な期待は、オプションフラグが1つの引数値を超えてはいけないことです。

#!/bin/bash
#
progname="${0##*/}"
usage="Usage: $progname -u <userid> -n <jobname> -j <job>"

while getopts ':u:n:j:' OPT
do
    case "$OPT" in
        u)      userid="$OPTARG" ;;
        n)      jobname="$OPTARG" ;;
        j)      job="$OPTARG" ;;
        ?)      echo "$usage" >&2; exit 1 ;;
    esac
done
shift $(($OPTIND - 1))

# Append any remaining arguments to the job
[[ $# -gt 0 ]] && job="${job:+$job }$*"

printf "userid=%s, jobname=%s, job=%s.\n" "$userid" "$jobname" "$job"
exit 0

標準期待値を維持するには、残りのパラメータをジョブに追加する行を含めないでください。

おすすめ記事