如何在下面的脚本中使用bash和getopt将第二个参数解析为变量。
我可以做sh test.sh -u并让"userENT“显示。但是,如果我在这个脚本上执行sh test.sh -u testuser,就会得到一个错误。
#!/bin/sh
# Now check for arguments
OPTS=`getopt -o upbdhrstv: --long username,password,docker-build,help,version,\
release,remote-registry,stage,develop,target: -n 'parse-options' -- "$@"`
while true; do
case "$1" in
-u | --username)
case "$2" in
*) API_KEY_ART_USER="$2"; echo "userENT" ;shift ;;
esac ;;
-- ) shift; break ;;
* ) if [ _$1 != "_" ]; then ERROR=true; echo; echo "Invalid option $1"; fi; break ;;
esac
done
echo "user" $API_KEY_ART_USER如何传递-u测试用户而不具有无效选项testuser?
产出:
>sh test3.sh -u testuser
userENT
Invalid option testuser
user testuser发布于 2019-04-03 05:05:08
man getopt会告诉您,选项后面的冒号表示它有一个参数。在v之后只有一个冒号,在循环中也没有shift,所以您将无法解析第一个选项之后的任何选项。我不知道为什么您认为需要有第二个只有一个默认选项的case语句。此外,在您的代码中有许多错误的实践,包括使用所有caps、变量名和backticks来执行命令,而不是使用$()。你已经给你的问题贴上了标签,bash,但你的问题是/bin/sh。尝试一下,但是在不了解代码的情况下,您不应该使用代码。
#!/bin/sh
# Now check for arguments
opts=$(getopt -o u:pbdhrstv: --long username:,password,docker-build,help,version,\
release,remote-registry,stage,develop,target: -n 'parse-options' -- "$@")
while true; do
case "$1" in
-u|--username)
shift
api_key_art_user="$1"
echo "userENT"
;;
--)
shift;
break
;;
*)
if [ -n "$1" ]; then
err=true
echo "Invalid option $1"
fi
break
;;
esac
shift
done
echo "user $api_key_art_user"https://stackoverflow.com/questions/55485740
复制相似问题