Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/27.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux Bash正在为跳过迭代_Linux_Bash_For Loop_Iteration - Fatal编程技术网

Linux Bash正在为跳过迭代

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

我必须写一个宏,它几乎没有参数。例如./macro.sh-erroone-f filename-erroone。 我必须抓住错误的,列出它们,并对有效的进行必要的操作。这是我的密码:

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/Linux
getopt(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