我正在写一个bash脚本,它可以有三个选项:c,p和m; c不能有参数,但p和m必须有参数。在我的脚本中,我有以下几行代码:
while getopts ":cp:m:" opt
do
case $opt in
c ) capitals=1
;;
m ) length=$OPTARG
;;
p ) number=$OPTARG
;;
\? ) echo "ERROR" 1>&2
exit 1
;;
esac
done
shift `expr $OPTIND - 1`
现在,当我在命令行中写
时myScript.sh -c -p 15 -m 12
一切都很完美。但是当我写作
myScript.sh -cp15m12
它出错了。 Bash将选项'p'
的参数解释为"15m12"
,而它应该只是"15"
。
我该如何解决这个问题?
答案 0 :(得分:3)
由于未键入命令行参数,因此无法告诉bash
-p
的参数必须是整数,因此bash
无法推断出解析-cp15m12
的正确方法是-c -p15 -m12
而不是-c -p15m12
。由于-c
不能使用参数而getopts
无法定义多字符选项,bash
可以推断出{{1} }被分为两个单独的选项,-cp15
和-c
。
答案 1 :(得分:0)
getopts
的价值相当有限 - 编写支持选项群集的替代品并不困难。这是一个快速的临时尝试。
#!/bin/sh
while true; do
case $1 in
-*) opt=${1#-}; shift;;
*) break;;
esac
while [ "$opt" ]; do
case $opt in
'-') opt=""; break 2;;
c*) capitals=1; opt=${opt#c};;
m[0-9]*)
opt=${opt#m}; length=${opt%%[!0-9]*}; opt=${opt#$length};;
m) opt=""; length=$1; shift;;
p[0-9]*)
opt=${opt#p}; number=${opt%%[!0-9]*}; opt=${opt#$number};;
p) opt=""; number=$1; shift;;
h|\?) echo "Syntax: $0 [-c] [-m length] [-p number]" >&2; exit 1;;
*) echo "Invalid option '$opt'" >&2; exit 2;;
esac
done
done
cat <<HERE
capitals: '$capitals'
length: '$length'
number: '$number'
args: '$@'
HERE
(不确定break 2
是否与库存sh
完全兼容。在dash
上为我工作。)