Come rimuovere un parametro posizionale da $ @


13

Fondamentalmente, voglio "cogliere" la prima occorrenza -infdall'elenco dei parametri. (I restanti parametri verranno passati a un comando diverso.)

Lo script che ho ha la seguente struttura:

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

C'è un buon modo per farlo?

A proposito, anche se sono principalmente interessato a risposte applicabili a /bin/sh, sono anche interessato a risposte applicabili solo a /bin/bash.


@cuonglm: sono tornato alla forma originale dello pseudo codice; nella mia esperienza, ogni volta che semplifico troppo l'immagine, ottengo risposte che funzionano per il caso semplificato, ma non per quello reale.
KJo

Risposte:


20

POSIXly:

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

printf '%s\n' "$@"

Il codice sopra funziona anche con shell pre-POSIX, ad eccezione della shell Almquist originale (Leggi l' endnote ). Cambia il forloop in:

for arg
do
  ...
done

garanzia di lavorare in tutte le conchiglie.


Un altro POSIX:

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

Con questo, è necessario rimuovere il primo (in (pattern)per farlo funzionare nelle shell pre-POSIX.


Grazie. Quell'argomento la tecnica del ciclismo è molto bella. Ha il vantaggio aggiuntivo che rende molto facile ispezionare il parametro seguendo quello attuale (dal momento che è semplicemente seduto lì dentro $1). Questa proprietà è stata utile in quello che sto facendo. Inoltre, grazie per avermi ricordato che il in "$@"; bit nella parte superiore del forloop non è necessario. È qualcosa che ho visto prima, ma tendo a dimenticarlo. Per quanto riguarda la tua osservazione sulla shell Almquist, do deve apparire nella riga successiva o for arg; dofunzionerebbe anche?
KJo

1
for arg; dolavoro in Almquist shell
cuonglm

2
Per chi non lo sapesse for arg doè un linguaggio abbreviato per for arg in "$@"; do. Questo mi ha lanciato per circa 5 secondi! Alcuni potrebbero dire che quest'ultimo è più leggibile :)
Starfry il

0

Ho trovato questa domanda mentre cercavo di risolvere un problema simile, tuttavia volevo elaborare tutti gli argomenti non di opzione (quelli che non iniziano con -) fino a qualsiasi --separatore ricevuto . Volevo estrarre solo gli argomenti trattati e lasciare in situ quelli rimanenti nell'ordine fornito.

Ecco cosa mi è venuto in mente.

parse=true
for arg do
  [ "$arg" == '--' ] && parse=false
  shift
  if $parse && [ "${arg:0:1}" != '-' ]
  then
    echo handling $arg
  else
    set -- "$@" "$arg"
  fi
done
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.