shell脚本:获取指定的参数范围

shell脚本:获取指定的参数范围,shell,Shell,如果谷歌不工作,我通常会来这里。所以这次是这样的: 在函数中,我想从第4个输入参数开始赋值给变量。 例如: function foo { var="$4$5$6..." use var commands using $1, etc } 所以我想我不能使用shift,因为我想在之后使用$1。我也不想使用额外的var来存储$1、$2、$3和shift。那么它应该如何工作呢?有人想要一个没有巴西主义的版本?好吧,但你不会喜欢的 function foo { va

如果谷歌不工作,我通常会来这里。所以这次是这样的: 在函数中,我想从第4个输入参数开始赋值给变量。 例如:

function foo {  
  var="$4$5$6..."   
  use var  
  commands using $1, etc  
}

所以我想我不能使用shift,因为我想在之后使用$1。我也不想使用额外的var来存储$1、$2、$3和shift。那么它应该如何工作呢?

有人想要一个没有巴西主义的版本?好吧,但你不会喜欢的

function foo {
    var=${@:4}
    # ...
}
#!/bin/sh

do_something () {
        i=4
        var=
        while [ $i -lt 10 ] ; do
                tmp=
                eval tmp=\"'$'$i\"
                if [ -z "$tmp" ] ; then
                        break
                else
                        var="$var$tmp"
                fi
                i=$(($i+1))
        done
        echo $var
}

do_something one two three four five six "six and a half" seven eight nine
我用dash和FreeBSD的sh对此进行了测试,但我不能真正保证评估的可移植性。我还必须将其限制在参数$1到$9之间,因为在这之后它将停止工作。

此外,Alex回答:

除最后一个之外的所有参数:

var=${@:1:${#}-1}
最后一个论点:

var=${@:${#}}  

or POSIX:
eval var=\${{#}}

“我既不想使用额外的var来存储$1、$2、$3和shift”。坏主意。这个怎么了?这就是外壳的工作原理。为什么要拒绝简单、明显、正确的解决方案呢?对于“jamessan”:$1等出现在我需要的地方后面,而$1等仅在以后使用一次。因此,我试图省去显式存储它们的工作量。(假设在本例中不是4,而是10,那么我需要存储9次。)