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

Her*_*rms 119 arrays bash

我正在编写一个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,然后循环其余的$@.

  • 看,我*知道*有一个简单的答案.:) (8认同)
  • 这完全含糊不清-不如下面的@nos 回答有用 (2认同)

Pau*_*ce. 136

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

for item in "${@:2}"
do
    process "$item"
done
Run Code Online (Sandbox Code Playgroud)

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

  • 谢谢$ {@:2}.好东西! (4认同)

nos*_*nos 39

firstitem=$1
shift;
for item in "$@" ; do
  #process item
done
Run Code Online (Sandbox Code Playgroud)

  • +1表示一个简单的例子; 请注意,"in"$ @"`部分是隐含的,可以省略. (4认同)
  • @DavidDoria:是的,你可以.试试`set - 1'2'''三四'; 对于项目; 回声"[$ item]"; done` (3认同)
  • 请记住,`$0` 通常是脚本名称。 (2认同)

Mag*_*ero 5

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)