Linux Bash正在为跳过迭代
我必须写一个宏,它几乎没有参数。例如./macro.sh-erroone-f filename-erroone。 我必须抓住错误的,列出它们,并对有效的进行必要的操作。这是我的密码:Linux Bash正在为跳过迭代,linux,bash,for-loop,iteration,Linux,Bash,For Loop,Iteration,我必须写一个宏,它几乎没有参数。例如./macro.sh-erroone-f filename-erroone。 我必须抓住错误的,列出它们,并对有效的进行必要的操作。这是我的密码: for i in "${ArrayOfParameters[@]}" do tmp=$[tmp+1] case "${i}" in "-h" | "--help") help ;; "-f") a="${ArrayOfPara
for i in "${ArrayOfParameters[@]}"
do
tmp=$[tmp+1]
case "${i}" in
"-h" | "--help")
help
;;
"-f")
a="${ArrayOfParameters[i+1]}"
echo $a
i=$[i+1]
;;
*)
echo -e "${red}Parameter ${i} is wrong!${NC}"
;;
esac
done
我的问题是,我不知道如何让文件名被跳过默认的操作跳过:(每次我得到文件名错误的错误,我想跳过一次迭代。C++中的类似的事情。
for(int i=0;i<5;i++)
if(i==3)
i=4;
for(int i=0;i如果我理解正确,您希望在找到-f
后跳过下一项,对吗?如果是这种情况,您可以使用更像C的语法并使用数组索引,而不是数组内容
我认为最简单的解决方案是使用一个设置为true
if'-f'匹配的标志变量,在for循环开始时,检查该标志是否设置,将其设置为false并使用continue
skipNext=false
for i in "${ArrayOfParameters[@]}"
do
if $skipNext
then
skipNext=false
continue
fi
tmp=$[tmp+1]
case "${i}" in
"-h" | "--help")
help
;;
"-f")
skipNext=true
a="${ArrayOfParameters[i+1]}"
echo $a
i=$[i+1]
;;
*)
echo -e "${red}Parameter ${i} is wrong!${NC}"
;;
esac
done
虽然不能直接回答您的编码问题,但我认为您应该帮自己一个忙,使用getopts
(请参阅)。处理参数通常很麻烦,而且有很多死角,所以自己滚动并不总是一个好主意。GNU/Linuxgetopt(1)
比getopts
多功能。虽然不是每个系统都提供它,尤其是BSD系列,但它通常很容易用软件包管理器安装。正在寻找最简单的解决方案。此外,不知道用户将使用什么系统,因此必须尽可能多地编写通用脚本。我明白了。不过,请注意,与getopt
相反,getopts
是bash的一部分,并且已经是bash的一部分。因此,如果您至少可以依赖脚本需要bash这一事实,那么您应该是安全的。如果您不能依赖它是bash这一事实,那么您需要注意很多事情(算术扩展、if中的双引号等)嗯,虽然它仍然不能像我预期的那样工作:/。将使用其他解决方案:P,那么。@user3593720,如果你编辑你的问题,解释为什么不能像预期的那样工作,也许我们可以处理;-)问题仍然是一样的。假设我的第三个参数是-f文件的第四个名称,第五个参数是-g。我希望程序跳过第四个参数,因为如果它不跳过它,*)(默认值)会给我写一条消息。我在你的代码中做了所有类似的事情,但仍然*)正在编写没有跳过该项>@user3593720,你的意思是它仍然打印第四个参数(文件名)?因为我试过使用ArrayOfParameters=(“-hello”“-howdy”“-foo bar”“-f”“-something”“-g”“whates”)
并跳过-f
之后的项目,从-f
跳到-g
(不显示-something
)。或者,当循环找到-f
时,是否要完全停止循环?(你需要一个break
)我的测试是在Ubuntu 12.04和bash 4.2.25上进行的。也许你可以编辑你的问题,并添加新的代码?哦,Nvm,我已经修复了它:P我是傻瓜!为及
#!/bin/bash
declare -a ArrayOfParameters=("-hello" "-howdy" "-foo bar" "-f" "-something else")
for ((i=0; i <= ${#ArrayOfParameters[@]}; i++))
do
item=${ArrayOfParameters[i]}
echo "Studying item number ${i} (value: ${item})"
case "${item}" in
"-f")
echo "Found -f. Skipping next."
((i++))
;;
*)
echo "NOT skipping ${item}"
;;
esac
done
Studying item number 0 (value: -hello)
NOT skipping -hello
Studying item number 1 (value: -howdy)
NOT skipping -howdy
Studying item number 2 (value: -foo bar)
NOT skipping -foo bar
Studying item number 3 (value: -f)
Found -f. Skipping next.
Studying item number 5 (value: )
NOT skipping
skipNext=false
for i in "${ArrayOfParameters[@]}"
do
if $skipNext
then
skipNext=false
continue
fi
tmp=$[tmp+1]
case "${i}" in
"-h" | "--help")
help
;;
"-f")
skipNext=true
a="${ArrayOfParameters[i+1]}"
echo $a
i=$[i+1]
;;
*)
echo -e "${red}Parameter ${i} is wrong!${NC}"
;;
esac
done