Arrays 从bash中的$@中删除第一个元素

Arrays 从bash中的$@中删除第一个元素,arrays,bash,Arrays,Bash,我正在编写一个bash脚本,它需要循环传递到脚本中的参数。然而,第一个参数不应该循环,而是需要在循环之前检查 如果我不必删除第一个元素,我可以: for item in "$@" ; do #process item done 我可以修改循环来检查它是否在第一次迭代中,并改变其行为,但这似乎太草率了。必须有一种简单的方法来提取第一个参数,然后循环其余的参数,但我找不到它。使用shift 基本上,阅读循环前的第一个参数$1(或者$0,如果要检查的是脚本名称),然后使用shift,然后循环剩

我正在编写一个bash脚本,它需要循环传递到脚本中的参数。然而,第一个参数不应该循环,而是需要在循环之前检查

如果我不必删除第一个元素,我可以:

for item in "$@" ; do
  #process item
done

我可以修改循环来检查它是否在第一次迭代中,并改变其行为,但这似乎太草率了。必须有一种简单的方法来提取第一个参数,然后循环其余的参数,但我找不到它。

使用
shift


基本上,阅读循环前的第一个参数
$1
(或者
$0
,如果要检查的是脚本名称),然后使用
shift
,然后循环剩余的
$@

另一个变体使用数组切片:

firstitem=$1
shift;
for item in "$@" ; do
  #process item
done
for item in "${@:2}"
do
    process "$item"
done
如果出于某种原因,由于
shift
具有破坏性,您希望保留参数,那么这可能很有用

q=${@:0:1};[ ${2} ] && set ${@:2} || set ""; echo $q
编辑

带有正则数组的pop示例

   LIST=( one two three )
    ELEMENT=( ${LIST[@]:0:1} );LIST=( "${LIST[@]:1}" ) 
    echo $ELEMENT

请记住,
$0
通常是脚本名。+1用于显示简单示例;请注意,“$@”部分中的
是隐含的,可以省略。@mklement0您是说您可以只做“for item;do”?@DavidDoria:是的,您可以。尝试设置--1'二''三四';对于项目;不回显“[$item]”;完成
看,我知道答案很简单。:)值得投票,但在丹尼斯的答案被接受后:)@mgarciaisaia似乎更适合OP的要求:删除第一项这完全是模糊的-没有下面的@nos-answer有用。有一个例子可以避免访问可能有一天消失的外部链接。感谢${@:2}。好东西!正是我想要的。现在不需要临时变量来取消引用
“${!1}${@:2}”
@Herms中的第一个参数。这应该是公认的答案,可读性更强,不破坏性(vs shift)很好,非常感谢。从技术上讲,当前公认的答案是正确的,但从技术上讲,这也是正确的(因为shift是破坏性的)。这是一个更好的答案。因此,理想情况下应该是答案。请也解释代码更具教育性。
q=${:0:1}
(顺便说一句,你的解释错误地引用了它为
q=${:1}
)应该是
q=${:1:1}
,更清楚地说:
$
从索引1开始,大概是为了与显式的
$1
$2
。。。参数-元素0没有值(不同于它的显式对应项,
$0
,它反映了shell/script文件)<如果
$2
包含嵌入空格,则code>[${2}]将中断;如果改用
[[${2}]
,就不会有这个问题。也就是说,不需要条件和
|
分支:如果只有一个参数,
${@:2}
将简单地扩展到空字符串(续),使用
set--
以确保恰好看起来像选项的参数不会被
set
解释为选项,并且应该在
echo
语句中双引号引用
${:2}
引用和
$q
引用。此时我们得到:
q=${@:1:1};集合--“${@:2}”;回显“$q”
。然而,
q=${@:1:1}
只是表示
$1
的另一种(更麻烦的)方式,其余的基本上重新实现了
shift
命令;使用这些特性,我们可以得到:
q=$1;转移;echo“$q”
@mklement0我想知道哪里是放置printf来清理路径的好地方?(我希望我能说得更清楚)不幸的是,我不明白。什么路?用什么方法清洁?
   LIST=( one two three )
    ELEMENT=( ${LIST[@]:0:1} );LIST=( "${LIST[@]:1}" ) 
    echo $ELEMENT