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

时间:2010-04-23 19:26:05

标签: arrays bash

我正在编写一个bash脚本,需要遍历传递给脚本的参数。但是,第一个参数不应该循环,而是需要在循环之前进行检查。

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

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

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

4 个答案:

答案 0 :(得分:124)

使用shift

http://tldp.org/LDP/Bash-Beginners-Guide/html/sect_09_07.html

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

答案 1 :(得分:124)

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

for item in "${@:2}"
do
    process "$item"
done

如果出于某种原因,您希望保留参数,因为shift具有破坏性,这可能很有用。

答案 2 :(得分:38)

firstitem=$1
shift;
for item in "$@" ; do
  #process item
done

答案 3 :(得分:5)

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

修改

> q=${@:1}
# gives the first element of the special parameter array ${@}; but ${@} is unusual in that it contains (? file name or something ) and you must use an offset of 1;

> [ ${2} ] 
# checks that ${2} exists ; again ${@} offset by 1
    > && 
    # are elements left in        ${@}
      > set ${@:2}
      # sets parameter value to   ${@} offset by 1
    > ||
    #or are not elements left in  ${@}
      > set ""; 
      # sets parameter value to nothing

> echo $q
# contains the popped element

带有常规数组的pop的示例

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