我正在编写一个bash脚本,需要遍历传递给脚本的参数。但是,第一个参数不应该循环,而是需要在循环之前进行检查。
如果我不必删除第一个元素,我可以这样做:
for item in "$@" ; do
#process item
done
我可以修改循环以检查它是否在第一次迭代中并改变行为,但这似乎太过于苛刻。必须有一种简单的方法来提取第一个参数然后循环其余参数,但我无法找到它。
答案 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