加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

bash中的getopts,脚本之前正在工作,现在我感到很困惑

发布时间:2020-12-15 21:24:10 所属栏目:安全 来源:网络整理
导读:所以我的bash脚本中有几个getopts.这是一个工作的例子. FOUND=SEARCH=COUNT=0while getopts "ips:flenkc" OPTIONdocase $OPTION in i) FOUND=1 let "COUNT++" ;; p) FOUND=2 let "COUNT++" ;; s) FOUND=3 SEARCH=$OPTARG let "COUNT++" ;;esacdone 稍后在一
所以我的bash脚本中有几个getopts.这是一个工作的例子.

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

在此程序工作之前,但是现在,甚至没有一件事能让它输入FIRST,LAST,EMAIL和NUMBER(在我尝试更改代码以查看它是否正在执行某些步骤时).

我对getopts做错了什么?它之前工作正常,但现在….它根本不起作用!

解决方法

有一点值得注意:如果你的脚本已经调用了一次getopts,那么另一个getopts调用将在所有选项之后开始,因此实际上什么都不做;在每次后续getopts调用之前将OPTIND重置为1,以使它们重新处理所有选项.

您的代码既有语法错误,也值得清理:

> if [[-z …声明错过了一个.
>使用后//会导致语法错误 – 类似POSIX的shell使用#作为注释char.
>由于这是bash脚本,坚持使用[[…]]一致(不需要[…])和/或使用((…))进行算术运算.

>具体来说,避免[… == …],因为它混合了POSIX语法 – […] – 使用特定于Bash的语法 – ==(POSIX仅支持=).
>如果您确实使用[…],请务必双引号变量引用,以确保安全.

>不需要多个[[…]]表达式将它们组合在一起 – 在一个[[… || …… || ……]].
>最好避免全大写的shell变量名称,以便avoid conflicts with environment variables and special shell variables.
>使用>& 2将错误消息输出到stderr.
>将整个参数包含在双引号中的echo -e中,以保护变量值免受可能不需要的扩展.

通常可以使用shellcheck.net捕获语法错误.

总而言之,我们得到:

#!/usr/bin/env bash

# ... code that sets $found

# If you've already processed args. with getopts above,# you must reset OPTIND to process them again.
OPTIND=1

if (( found == 1 )) # found is numeric,use arithmetic expression to compare
then
        echo "You have chosen to insert things."
        first= last= email= number= # don't use all-uppercase var. names
        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 ]]; then
            echo "Error!!! Some input is missing!!!" >&2
            usage # display usage
            exit 1
        fi
        echo -e "$firstt$lastt$emailt$number" >> contacts
fi

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读