通过参数跳过第一个来迭代

pie*_*iet 46 bash

嗨,我有以下内容:

bash_script parm1 a b c d ..n
Run Code Online (Sandbox Code Playgroud)

我想迭代并打印命令行中的所有值,从a开始,而不是从parm1开始

Ism*_*awi 120

你可以用bash"切片"数组; 而不是使用shift,你可能会使用

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

$@是所有命令行参数${@:2}的数组,是第一个元素的相同数组.双引号确保正确的空格处理.

  • @jkgeyti这不是globbed路径的问题,只是空白处理的问题.正确地引用像"for i in"$ {@:2}"; 回声"$ i"; 完成了修复那个问题. (6认同)
  • 要小心,因为切片可能会导致例如全局路径中的空白问题.如果调用`./script.sh文件夹/*`,文件`folder/my file`将被拆分为`folder/my`和`file`.使用`shift`和`$ 1`接受的答案在这种情况下可以正常工作. (3认同)

Sch*_*ron 29

这应该这样做:

#ignore first parm1
shift

# iterate
while test ${#} -gt 0
do
  echo $1
  shift
done
Run Code Online (Sandbox Code Playgroud)


gho*_*g74 9

如果您想稍后使用它,此方法将保留第一个参数

#!/bin/bash

for ((i=2;i<=$#;i++))
do
  echo ${!i}
done
Run Code Online (Sandbox Code Playgroud)

要么

for i in ${*:2} #or use $@
do
  echo $i
done
Run Code Online (Sandbox Code Playgroud)

  • $ {!i}做什么? (2认同)

Rin*_*g Ø 7

另一种味道,有点短,保持参数列表

shift
for i in "$@"
do
  echo $i
done
Run Code Online (Sandbox Code Playgroud)


Pau*_*ce. 7

您可以对位置参数使用隐式迭代:

shift
for arg
do
    something_with $arg
done
Run Code Online (Sandbox Code Playgroud)

如您所见,您不必"$@"for声明中包含.