如何从 $@ 中删除位置参数

如何从 $@ 中删除位置参数

-inf基本上,我想从参数列表中“取出”第一次出现的。 (其余参数将传递给不同的命令。)

我的脚本具有以下结构:

#!/bin/sh

<CODE>

for POSITIONAL_PARAM in "$@"
do

    <CODE>

    if [ "$POSITIONAL_PARAM" = '-inf' ]
    then
        <PLUCK $POSITIONAL_PARAM FROM $@>
        break
    fi

    <CODE>

done

<CODE>

some-other-command "$@"

# end of script

有没有好的方法可以做到这一点?

顺便说一句,尽管我主要对适用于 的答案感兴趣/bin/sh,但我也对仅适用于 的答案感兴趣/bin/bash

答案1

POSIXly:

for arg do
  shift
  [ "$arg" = "-inf" ] && continue
  set -- "$@" "$arg"
done

printf '%s\n' "$@"

上面的代码甚至可以在 POSIX 之前的 shell 中运行,除了原始的 Almquist shell(阅读尾注)。将循环更改for为:

for arg
do
  ...
done

保证在所有 shell 中工作。


另一个 POSIX:

for arg do
  shift
  case $arg in
    (-inf) : ;;
       (*) set -- "$@" "$arg" ;;
  esac
done

对于这个,您需要删除第一个((pattern)使其在 POSIX 之前的 shell 中工作。

答案2

我在尝试解决类似问题时发现了这个问题,但是我想处理所有非选项参数(那些不以 开头的参数-)直到任何收到的--分隔符。我只想取出已处理的参数,并将剩余的参数按提供的顺序留在原处。

这是我想出的。

parse=true
for arg do
  [ "$arg" == '--' ] && parse=false
  shift
  if $parse && [ "${arg:0:1}" != '-' ]
  then
    echo handling $arg
  else
    set -- "$@" "$arg"
  fi
done

相关内容