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

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

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

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

我可以修改循环来检查它是否在第一次迭代,并改变行为,但这似乎太冒昧。 有一个简单的方法来提取第一个参数,然后循环其余的,但我无法find它。

使用shift

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

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

另一个变体使用arrays切片:

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

如果由于某种原因,你想离开争论,因为这种shift是破坏性的,这可能是有用的。

 firstitem=$1 shift; for item in "$@" ; do #process item done 
 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 

使用常规数组popup的示例

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