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

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

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

for i in $@
do
      echo "$i"
done

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

我是脚本编写新手,因此如果有另一篇文章包含此答案,我深表歉意。我发现对某件事陌生通常意味着你不知道如何正确地询问你正在寻找的东西。

任何帮助将不胜感激!

答案1

如果不需要保留参数

while (( $# > 1 ))
do
  echo "$1"
  shift
done

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

SKIP=$#

let x=1

for i
do
  if (( x != SKIP ))
  then
    echo "$i"
  fi
  let x=x+1
done

答案2

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

for x in "${@:1:$# - 1}" ; do 
    echo do something with "$x"
done

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

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

答案3

skip_last() {
   p=$1; shift

   for i
   do
      set ${1+"$@"} "$p"; p=$1; shift
   done

   for i
   do
      # do something with i when i != last now
      echo "$i"
   done
}
# and then...
skip_last "a" "b" "c" "d" "e"

答案4

您可以使用for循环将变量设置i1, 2, ... n-1,并使用间接扩张将其变成$1, $2, ..., $n-1

for ((i=1; i<$#; i++)); do
    echo "${!i}"
done

相关内容