getopts在bash中,脚本以前是有效的,现在是I';我感到困惑
所以我的bash脚本中有几个getopt。这里有一个工作的例子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
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变量名,以避免出现错误
- 使用
将错误消息输出到stderr&2
- 将
的整个参数用双引号括起来,以保护变量值不受可能不需要的扩展的影响echo-e