具有多个值的 Bash 关键字参数

具有多个值的 Bash 关键字参数

我用它来获取 shell 脚本的关键字参数

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

您可以使用 选择其余参数"$*",但我真的不推荐它。标准期望是选项标志不应超过一个参数值。

#!/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

为了保持在标准期望范围内,请勿包含将剩余参数附加到作业的行。

相关内容