问题
我想以这种方式调用我的脚本文件:
代码语言:javascript复制$ ./myscript -s 45 -p any_string
或者
代码语言:javascript复制$ ./myscript -h #should display help
$ ./myscript #should display help
我的需求是:
- 在这里使用
getopts
获取输入参数。 - 检查是否存在
-s
参数,如果不存在则返回错误。 - 检查
-s
后面的值是否为 45 或 90。 - 检查是否存在
-p
参数,并且其后有一个输入字符串。 - 如果用户输入
./myscript -h
或者只输入./myscript
,则显示帮助信息。
到目前为止,我尝试了这段代码:
代码语言:javascript复制#!/bin/bash
while getopts "h:s:" arg; do
case $arg in
h)
echo "usage"
;;
s)
strength=$OPTARG
echo $strength
;;
esac
done
但是用那段代码会出错。如何在 Bash 中使用 getopts
?
回答
原始代码的问题是:
h:
预期会有参数,但实际上不应该有,需要将其改成h
(去掉冒号)。- 期望得到
-p any_string
,需要将p:
添加到参数列表中。
冒号 :
在选项之后意味着它需要参数。
按提问者需求,可以使用如下代码:
代码语言:javascript复制#!/bin/bash
usage() { echo "Usage: $0 [-s <45|90>] [-p <string>]" 1>&2; exit 1; }
while getopts ":s:p:" o; do
case "${o}" in
s)
s=${OPTARG}
((s == 45 || s == 90)) || usage
;;
p)
p=${OPTARG}
;;
*)
usage
;;
esac
done
shift $((OPTIND-1))
if [ -z "${s}" ] || [ -z "${p}" ]; then
usage
fi
echo "s = ${s}"
echo "p = ${p}"
示例运行:
代码语言:javascript复制$ ./myscript.sh
Usage: ./myscript.sh [-s <45|90>] [-p <string>]
$ ./myscript.sh -h
Usage: ./myscript.sh [-s <45|90>] [-p <string>]
$ ./myscript.sh -s "" -p ""
Usage: ./myscript.sh [-s <45|90>] [-p <string>]
$ ./myscript.sh -s 10 -p foo
Usage: ./myscript.sh [-s <45|90>] [-p <string>]
$ ./myscript.sh -s 45 -p foo
s = 45
p = foo
$ ./myscript.sh -s 90 -p bar
s = 90
p = bar
参考
- stackoverflow question 16483119
- help getopts