通过bash中的函数参数循环,如何检查参数的序数的条件?

时间:2014-08-07 12:18:05

标签: bash if-statement for-loop

我在bash中有一个函数,它接受参数,我想提取除第一个之外的所有参数。

我正在尝试这个

alias save=save
save(){
    for i in "$@"; do 
        if [ i -gt 1 ]
        then
            echo $i
        fi
    done
}

但是它给出了错误

  

sh.exe":[:i:预期的整数表达式

我知道$i是参数本身,所以这样做

if [ $i -gt 1 ]

给出错误

  

$ save hi hola
  sh.exe":[:hi:整数表达式预期
  sh.exe":[:hola:期望的整数表达式

如果$i是参数本身,并且i不作为变量工作,那么它还有什么用呢?

3 个答案:

答案 0 :(得分:3)

在Bash中执行此操作的方法是"${@:2}",这使得多元素扩展从第二个参数开始。这样就不必使用shift。如果需要,您仍然可以访问第一个参数。

save() {
    for i in "${@:2}"; do 
        echo "$i"
    done
}

如果您只想逐行打印参数,那么使用printf也是一种更简单的方法:

save() {
    printf '%s\n' "${@:2}"
}

答案 1 :(得分:2)

先做一个转变摆脱第一个arg。这样你就不需要循环体中的条件,你也可以将for i in "$@"简化为for i;,如下所示:

save() {
    shift
    for i; do 
        echo $i
    done
}

答案 2 :(得分:0)

不幸的是,无法使用带有参数数组$@$*的索引,您将获得错误的替换错误

但你可以将它分配给另一个数组,并像这样使用索引

 declare -a ARRAY=("$@")
 for ((i=1; i< ${#ARRAY[@]};i++ )) ; do
        echo "${ARRAY[$i]}"
 done

请注意,您的索引位于$i