我在OSX上,我需要一个处理多个参数的bash脚本。根据这个网站上的一些答案,我编写了以下bash脚本(为了隐私起见,删除了一些字符串):
#!/bin/bash
# A POSIX variable
OPTIND=1 # Reset in case getopts has been used previously in the shell.
# Default parameter value:
PORT=xxx
PUBKEY=xxx
HOST_IP=xxx
# show_help function
show_help() {
echo "Usage: $(basename "$0") [-h] [-p PORT] [-f PUBKEY] [-i HOST_IP]"
echo
echo " -p PORT add key to container running on port PORT (default: xxx)"
echo " -f PUBKEY add key file PUBKEY (default: xxx)"
echo " -i HOST_IP connect to host HOST_IP (default: xxx)"
echo
return
}
while getopts ":h:p:f:i:" option; do
case "$option" in
?)
echo "invalid argument"
show_help
exit 1
;;
h)
show_help
exit 0
;;
p) PORT=$OPTARG
;;
f) PUBKEY=$OPTARG
;;
i) HOST_IP=$OPTARG
;;
esac
done
shift $((OPTIND-1))
USER_AT_HOST="root@$HOST_IP"
PUBKEYPATH="$HOME/.ssh/$PUBKEY"
ssh-copy-id -i "$PUBKEYPATH" "$USER_AT_HOST" -p "$PORT"
exit 0
脚本适用于所有参数(包括无效参数),除了参数-h
。当我调用脚本
script.sh -h
的结果与
相同script.sh
而不是向我展示帮助。你能告诉我发生了什么吗?
getopts ":h:p:f:i:"
中h
之后的:
意味着-h
需要一个参数,但我认为-h
不需要任何参数。去掉h
后面的冒号
通常,getopts会显示一个错误:
option requires an argument -- h
但是,当您以另一个冒号开始字符串时,错误报告被关闭。删除初始的:
以查看参数处理中的错误。
在getopts
模式中,h:
说-h
必须有一个参数(例如-h 2
),所以,您尝试过script.sh -h 2
吗?
如果-h
不应该有任何参数,那么在h
之后删除:
,留下getopts ":hp:f:i:"