bash - 使用 getops 将第二个参数解析为变量
bash - using getops to parse second argument into a variable
如何在以下脚本中使用 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 "" in
-u | --username)
case "" in
*) API_KEY_ART_USER=""; echo "userENT" ;shift ;;
esac ;;
-- ) shift; break ;;
* ) if [ _ != "_" ]; then ERROR=true; echo; echo "Invalid option "; fi; break ;;
esac
done
echo "user" $API_KEY_ART_USER
如何通过 -u testuser 并且没有无效选项 testuser?
输出:
>sh test3.sh -u testuser
userENT
Invalid option testuser
user testuser
man getopt
会告诉您选项后面的冒号表示它有参数。 v 之后只有一个冒号。您也没有 shift
ing 在循环中,因此您将无法解析第一个选项之后的任何选项。而且我不确定为什么您觉得需要第二个 case
语句,它只有一个默认选项。此外,您的代码中存在许多不良做法,包括使用所有大写变量名称和反引号而不是 $()
来执行命令。你已经标记了你的问题 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 "" in
-u|--username)
shift
api_key_art_user=""
echo "userENT"
;;
--)
shift;
break
;;
*)
if [ -n "" ]; then
err=true
echo "Invalid option "
fi
break
;;
esac
shift
done
echo "user $api_key_art_user"
如何在以下脚本中使用 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 "" in
-u | --username)
case "" in
*) API_KEY_ART_USER=""; echo "userENT" ;shift ;;
esac ;;
-- ) shift; break ;;
* ) if [ _ != "_" ]; then ERROR=true; echo; echo "Invalid option "; fi; break ;;
esac
done
echo "user" $API_KEY_ART_USER
如何通过 -u testuser 并且没有无效选项 testuser?
输出:
>sh test3.sh -u testuser
userENT
Invalid option testuser
user testuser
man getopt
会告诉您选项后面的冒号表示它有参数。 v 之后只有一个冒号。您也没有 shift
ing 在循环中,因此您将无法解析第一个选项之后的任何选项。而且我不确定为什么您觉得需要第二个 case
语句,它只有一个默认选项。此外,您的代码中存在许多不良做法,包括使用所有大写变量名称和反引号而不是 $()
来执行命令。你已经标记了你的问题 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 "" in
-u|--username)
shift
api_key_art_user=""
echo "userENT"
;;
--)
shift;
break
;;
*)
if [ -n "" ]; then
err=true
echo "Invalid option "
fi
break
;;
esac
shift
done
echo "user $api_key_art_user"