从 for 循环中排除最后一个参数/参数

Syr*_*rum 5 centos

我希望创建一个 Shell 脚本,它将循环遍历除最后一个参数/参数之外的每个参数/参数。这是我到目前为止所拥有的:

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

这在我的 ./script.sh 命令之后显示所有参数方面效果很好,但我希望有一种方法可以忽略最后一个参数甚至我选择的任何参数(例如,如果有的话,总是忽略第三个参数)是一个)。需要明确的是,我现在更关心最后一个参数/参数。

我是脚本的新手,所以如果有另一篇包含此答案的帖子,我深表歉意。我发现对某些事物不熟悉通常意味着您不知道如何正确地询问您正在寻找的东西。

任何帮助将不胜感激!

ilk*_*chu 9

CentOS 可能有 Bash,所以如果你可以使用它,你可以运行数组的一个切片:

for x in "${@:1:$# - 1}" ; do 
    echo do something with "$x"
done
Run Code Online (Sandbox Code Playgroud)

${@:n:m}符号采用m从 number 开始的位置参数n。我们从中选择它们的总数$#并减一以忽略最后一个参数。偏移量和长度被视为算术表达式$((...)),因此我们可以在那里进行算术运算,正如 Stéphane 在下面评论的那样。数组索引通常从零开始,但在从零开始的情况下,$@shell 名称将从$0in 中,这不是我们想要的。

请注意,您很可能希望引用$@or${@:n:m}表达式以防止进一步拆分您的参数。

  • 或者只是`"${@:1:$#-1}"`(在`zsh`中需要`${@:1:$# -1}`,否则`$#-1`将被视为` ${#-}1`)。另见`zsh`中的`"$@[1,-2]"`或`"${@:1:-1}"` (2认同)

Ste*_*ris 8

如果不需要保留参数

while (( $# > 1 ))
do
  echo "$1"
  shift
done
Run Code Online (Sandbox Code Playgroud)

如果你想保持位置参数不变,你可以保持一个计数

SKIP=$#

let x=1

for i
do
  if (( x != SKIP ))
  then
    echo "$i"
  fi
  let x=x+1
done
Run Code Online (Sandbox Code Playgroud)