我正在编写一个bash脚本,需要循环传递给脚本的参数.但是,第一个参数不应该循环,而是需要在循环之前进行检查.
如果我不必删除第一个元素,我可以这样做:
for item in "$@" ; do
#process item
done
Run Code Online (Sandbox Code Playgroud)
我可以修改循环以检查它是否在第一次迭代中并改变行为,但这似乎太过于苛刻.必须有一个简单的方法来提取第一个参数然后循环其余的,但我无法找到它.
Amb*_*ber 139
用shift吗?
http://tldp.org/LDP/Bash-Beginners-Guide/html/sect_09_07.html
基本上,$1在循环之前读取第一个参数(或者$0如果你想要检查的是脚本名称),然后使用shift,然后循环其余的$@.
Pau*_*ce. 136
另一种变体使用数组切片:
for item in "${@:2}"
do
process "$item"
done
Run Code Online (Sandbox Code Playgroud)
如果出于某种原因,您希望将参数保留在原位,因为shift它具有破坏性,这可能很有用.
nos*_*nos 39
firstitem=$1
shift;
for item in "$@" ; do
#process item
done
Run Code Online (Sandbox Code Playgroud)
q=${@:0:1};[ ${2} ] && set ${@:2} || set ""; echo $q
Run Code Online (Sandbox Code Playgroud)
编辑
> 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
Run Code Online (Sandbox Code Playgroud)
弹出常规数组的示例
LIST=( one two three )
ELEMENT=( ${LIST[@]:0:1} );LIST=( "${LIST[@]:1}" )
echo $ELEMENT
Run Code Online (Sandbox Code Playgroud)