在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