getopts在bash中,脚本以前是有效的,现在是I';我感到困惑

getopts在bash中,脚本以前是有效的,现在是I';我感到困惑,bash,getopts,Bash,Getopts,所以我的bash脚本中有几个getopt。这里有一个工作的例子 FOUND= SEARCH= COUNT=0 while getopts "ips:flenkc" OPTION do case $OPTION in i) FOUND=1 let "COUNT++" ;; p) FOUND=2 let "CO

所以我的bash脚本中有几个getopt。这里有一个工作的例子

FOUND=
SEARCH=
COUNT=0
while getopts "ips:flenkc" OPTION
do
case $OPTION in
        i)
                FOUND=1
                let "COUNT++"
                ;;
        p)
                FOUND=2
                let "COUNT++"
                ;;
        s)
                FOUND=3
                SEARCH=$OPTARG
                let "COUNT++"
                ;;
esac
done
稍后,一个case语句将检查count=1(也就是说,调用中只使用了以下i、p和s中的一个)是否不重要,除非它确定正在执行的主要操作

现在讨论的是getopts。这以前是有效的,现在不是了。我们的目标是,如果有人想要输入数据,他们可以使用下面的bash命令

./programname -i -f Mary -l Sue -e smary@email.com -n 555-555-5555
其中,当使用-i时,必须有-f、-l、-e和-n(用于名字、姓氏、电子邮件和号码)。 我使用的代码:警告,代码中充满了语法错误。如果您正在学习bash,我强烈建议您不要使用我帖子中的任何内容。

if [ $FOUND == "1" ]
then
        echo "You have chosen to insert things."
        FIRST=
        LAST=
        EMAIL=
        NUMBER=
        while getopts "if:l:e:n:" OPTION
        do
        case $OPTION in
                f)
                        FIRST=$OPTARG
                        ;;
                l)
                        LAST=$OPTARG
                        ;;
                e)
                        EMAIL=$OPTARG
                        ;;
                n)
                        NUMBER=$OPTARG
                        ;;
        esac
        done

        if [[ -z $FIRST ]] || [[ -z $LAST ]] || [[ -z $EMAIL ]] || [[ -z $NUMBER ]]
            echo "Error!!! Some input is missing!!!"
            usage // display usage
        exit 1
        fi
        echo -e $FIRST"\t"$LAST"\t"$EMAIL"\t"$NUMBER >> contacts
fi
在此之前,这个程序可以工作,但现在,甚至没有一件事是使它成为输入的第一,最后,电子邮件,和数字(在我试图改变代码,看看它是否是使某些步骤)


我拿getopts做了什么错事?它以前工作得很好,但现在。。。。根本不起作用

一件值得注意的事情是:如果您的脚本已经调用了
getopts
一次,那么另一个
getopts
调用将在所有选项之后启动,因此实际上什么都不做;在每次后续的
getopts
调用之前,将
OPTIND
重置为
1
,让它们重新处理所有选项。

if [ $FOUND == "1" ]
then
        echo "You have chosen to insert things."
        FIRST=
        LAST=
        EMAIL=
        NUMBER=
        while getopts "if:l:e:n:" OPTION
        do
        case $OPTION in
                f)
                        FIRST=$OPTARG
                        ;;
                l)
                        LAST=$OPTARG
                        ;;
                e)
                        EMAIL=$OPTARG
                        ;;
                n)
                        NUMBER=$OPTARG
                        ;;
        esac
        done

        if [[ -z $FIRST ]] || [[ -z $LAST ]] || [[ -z $EMAIL ]] || [[ -z $NUMBER ]]
            echo "Error!!! Some input is missing!!!"
            usage // display usage
        exit 1
        fi
        echo -e $FIRST"\t"$LAST"\t"$EMAIL"\t"$NUMBER >> contacts
fi
您的代码有两个语法错误,通常值得清理:

  • 如果[[-z…
    语句缺少
    ,则
  • 使用
    之后的
    /
    会导致语法错误-类似于POSIX的shell使用
    作为注释字符
  • 因为这是
    bash
    脚本,所以请坚持一致地使用
    […]
    (不需要
    […]
    )和/或使用
    (…)
    进行算术运算。
    • 具体地说,避免使用
      […==…]
      ,因为它将POSIX语法-
      […]
      -与特定于Bash的语法-
      =
      (POSIX只支持
      =
    • 如果您确实使用了
      […]
      ,为了安全起见,请确保对变量引用进行双引号引用
  • 无需将多个
    [[…]]
    表达式连接到或同时连接到它们-在单个
    [[…| | | | |]
    中执行此操作
  • 最好避免使用所有大写的shell变量名,以避免出现错误
  • 使用
    &2
    将错误消息输出到stderr
  • echo-e
    的整个参数用双引号括起来,以保护变量值不受可能不需要的扩展的影响
仅仅是语法错误通常可以通过使用来捕获

综上所述,我们得到: