So entfernen Sie einen Positionsparameter aus $ @

13

Grundsätzlich möchte ich das erste Vorkommen von -infaus der Parameterliste "herauszupfen" . (Die restlichen Parameter werden an einen anderen Befehl übergeben.)

Das Skript, das ich habe, hat die folgende Struktur:

#!/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

Gibt es eine gute Möglichkeit, dies zu tun?

Übrigens, obwohl ich hauptsächlich an Antworten interessiert bin, die auf zutreffen /bin/sh, bin ich auch an Antworten interessiert, die nur auf zutreffen /bin/bash.

kjo
quelle
@ Cuonglm: Ich habe die ursprüngliche Form des Pseudocodes wiederhergestellt. Wenn ich das Bild zu stark vereinfache, erhalte ich meiner Erfahrung nach Antworten, die für den vereinfachten Fall funktionieren, aber nicht für den tatsächlichen.
kjo

Antworten:

20

POSIXly:

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

printf '%s\n' "$@"

Der obige Code funktioniert sogar in Pre-POSIX-Shells mit Ausnahme der ursprünglichen Almquist-Shell ( Endnote lesen ). Ändern Sie die forSchleife in:

for arg
do
  ...
done

Garantie für die Arbeit in allen Schalen.


Ein weiteres POSIX:

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

Mit diesem, müssen Sie die erste entfernen (in (pattern)es in pre-POSIX - Schalen zu arbeiten.

cuonglm
quelle
Vielen Dank. Dieses Argument Fahrradtechnik ist sehr schön. Es hat den zusätzlichen Bonus, dass es sehr einfach ist, den Parameter zu überprüfen, der dem aktuellen folgt (da er genau dort drin sitzt $1). Diese Eigenschaft hat sich als nützlich erwiesen, was ich tue. Vielen Dank auch, dass Sie mich daran erinnert haben, dass das in "$@"; Bit oben in der forSchleife nicht erforderlich ist. Es ist etwas, was ich schon gesehen habe, aber ich neige dazu, es zu vergessen. In Bezug auf Ihre Bemerkung über den Almquist Shell, werden die do haben in der nächsten Zeile angezeigt werden soll , oder würden for arg; doauch funktionieren?
kjo
1
for arg; do Arbeit in Almquist Shell
Cuonglm
2
Für die Uneingeweihten for arg doist eine Abkürzung für for arg in "$@"; do. Das warf mich für ca. 5 Sekunden! Einige könnten sagen, das letztere ist besser lesbar :)
starfry
0

Ich habe diese Frage gefunden, als ich versucht habe, ein ähnliches Problem zu lösen, aber ich wollte alle Nicht-Options-Argumente (die nicht mit beginnen -) bis zu einem empfangenen --Trennzeichen verarbeiten. Ich wollte nur die verarbeiteten Argumente herauszupfen und die übrigen in der angegebenen Reihenfolge an Ort und Stelle belassen.

Folgendes habe ich mir ausgedacht.

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