如何在以下脚本中使用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
而不出现Invalid option testuser
错误?
输出:
>sh test3.sh -u testuser
userENT
Invalid option testuser
user testuser
1条答案
按热度按时间tmb3ates1#
man getopt
会告诉你选项后面的冒号表示它有一个参数。你只有在v后面有一个冒号。你也没有在循环中使用shift
,所以你不能解析第一个选项之后的任何选项。我不知道为什么你觉得需要第二个case
语句,它只有一个默认选项。另外,你的代码中有很多不好的做法,包括使用全大写的变量名和反勾号而不是$()
来执行命令。你把问题标记为bash,但你的问题是/bin/sh
。给予一下,但你不应该在不了解它的功能的情况下使用代码。