Bash脚本工作与所有参数,除了一个



我在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:"

相关内容

最新更新