Comment supprimer un paramètre positionnel de $ @


13

Fondamentalement, je veux "arracher" la première occurrence de -infla liste des paramètres. (Les paramètres restants seront transmis à une autre commande.)

Le script que j'ai a la structure suivante:

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

Y at-il un bon moyen de le faire?

BTW, même si je suis principalement intéressé par les réponses applicables à /bin/sh, je suis également intéressé par les réponses applicables uniquement à /bin/bash.


@cuonglm: je suis revenu à la forme originale du pseudo-code; d'après mon expérience, chaque fois que je simplifie trop l'image, j'obtiens des réponses qui fonctionnent pour le cas simplifié, mais pas pour le cas réel.
kjo

Réponses:


20

POSIX:

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

printf '%s\n' "$@"

Le code ci-dessus fonctionne même dans les shells pré-POSIX, à l'exception du shell Almquist d'origine (lire la note de fin ). Changez la forboucle en:

for arg
do
  ...
done

garantie de travailler dans toutes les coquilles.


Un autre POSIX:

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

Avec celui - ci, vous devez retirer le premier (à (pattern)le faire fonctionner dans des coquilles pré-POSIX.


Merci. Cette technique de cyclisme d'argument est très agréable. Il a l'avantage supplémentaire de rendre très facile l'inspection du paramètre suivant le paramètre actuel (car il est juste assis juste là $1). Cette propriété m'a été utile dans ce que je fais. Aussi, merci de me rappeler que le in "$@"; bit en haut de la forboucle n'est pas nécessaire. C'est quelque chose que j'ai vu auparavant, mais j'ai tendance à l'oublier. En ce qui concerne votre remarque sur la coquille Almquist, ne l' do ont à apparaître sur la ligne suivante, ou ne for arg; dofonctionne aussi?
kjo

1
for arg; dotravail dans la coquille d'Almquist
cuonglm

2
Pour les non-initiés for arg doest un idiome raccourci pour for arg in "$@"; do. Cela m'a jeté pendant environ 5 secondes! Certains pourraient dire que ce dernier est plus lisible :)
Starfry

0

J'ai trouvé cette question en essayant de résoudre un problème similaire, mais je voulais traiter tous les arguments sans option (ceux qui ne commencent pas par -) jusqu'à n'importe quel --séparateur reçu . Je voulais extraire uniquement les arguments traités et laisser les autres en place dans l'ordre fourni.

Voici ce que j'ai trouvé.

parse=true
for arg do
  [ "$arg" == '--' ] && parse=false
  shift
  if $parse && [ "${arg:0:1}" != '-' ]
  then
    echo handling $arg
  else
    set -- "$@" "$arg"
  fi
done
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.