我用它来获取 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
为了保持在标准期望范围内,请勿包含将剩余参数附加到作业的行。