bash中的getopts,脚本之前正在工作,现在我感到很困惑
所以我的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(对于名字,姓氏,电子邮件和号码). 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语法 – […] – 使用特定于Bash的语法 – ==(POSIX仅支持=). >不需要多个[[…]]表达式将它们组合在一起 – 在一个[[… || …… || ……]]. 通常可以使用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 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |