bash-使用getops将第二个参数解析为变量

时间:2019-04-03 01:28:40

标签: bash getopt

如何在以下脚本上使用bash和getopt将第二个参数解析为变量。

我可以执行sh test.sh -u并显示“ userENT”。但是,如果我在此脚本上使用了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而没有无效的选项testuser?

输出:

>sh test3.sh -u testuser
userENT

Invalid option testuser
user testuser

1 个答案:

答案 0 :(得分:1)

man getopt会告诉您,选项后的冒号表示它有一个参数。 v之后只有一个冒号。循环中也没有shift,因此您将无法解析第一个选项之后的任何选项。而且我不确定您为什么觉得需要第二条case语句,而该语句仅具有一个默认选项。此外,您的代码中还有许多不良做法,包括使用所有大写字母的变量名和反引号代替$()来执行命令。并且您已经标记了问题,但是您的最高排名是/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"