Spiega il comando shell: shift $ (($ optind - 1))


30

Non sono un tipo Linux ma sono bloccato in alcuni script che devo leggere per il mio progetto. Quindi qualcuno può aiutarmi a fare questo comando?

shift $(($optind - 1))

3
Come indicato di seguito, OPTIND deve essere in maiuscolo e il '$' tra parentesi è facoltativo.
DarkHeart,

Risposte:


49

shift $((OPTIND-1))(la nota OPTINDè maiuscola) normalmente si trova immediatamente dopo un getopts whileciclo. $OPTINDè il numero di opzioni trovate da getopts.

Come menziona pauljohn32 nei commenti, in senso stretto, OPTINDfornisce la posizione del prossimo argomento della riga di comando.

Dal manuale di riferimento di GNU Bash :

getopts optstring name [args]

getoptsviene utilizzato dagli script della shell per analizzare i parametri posizionali. optstringcontiene i caratteri di opzione da riconoscere; se un carattere è seguito da due punti, si prevede che l'opzione abbia un argomento, che dovrebbe essere separato da esso da spazi bianchi. I due punti (':') e il punto interrogativo ('?') Non possono essere usati come caratteri di opzione. Ogni volta che viene invocato, getoptsinserisce l'opzione successiva nel nome della variabile della shell, inizializzando namese non esiste e l'indice dell'argomento successivo da elaborare nella variabile OPTIND. OPTINDviene inizializzato su 1 ogni volta che viene invocato lo script shell o shell. Quando un'opzione richiede un argomento, getopts inserisce tale argomento nella variabile OPTARG. La shell non si reimpostaOPTIND automaticamente; deve essere reimpostato manualmente tra più chiamate getoptsall'interno della stessa invocazione della shell se si desidera utilizzare un nuovo set di parametri.

Quando viene rilevata la fine delle opzioni, getoptsesce con un valore di ritorno maggiore di zero. OPTINDè impostato sull'indice del primo argomento non opzionale e il nome è impostato su '?'.

getoptsanalizza normalmente i parametri posizionali, ma se vengono forniti più argomenti args, getoptsanalizza invece quelli.

shift n
rimuove n stringhe dall'elenco dei parametri posizionali. shift $((OPTIND-1))Rimuove così tutte le opzioni che sono state analizzate getoptsdall'elenco dei parametri, e quindi dopo quel punto, $1farà riferimento al primo argomento non-opzione passato allo script.

Aggiornare

Come menziona mikeserv nel commento, shift $((OPTIND-1))può non essere sicuro. Per evitare una divisione indesiderata delle parole, ecc., Tutte le espansioni dei parametri devono essere racchiuse tra virgolette doppie. Quindi il modulo sicuro per il comando è

shift "$((OPTIND-1))"


Sembra che funzionerà bene solo se tutte le opzioni si verificano prima di qualsiasi argomento posizionale rimanente. Corretta?
Steve Jorgensen,

@SteveJorgensen: Sì, è corretto. OTOH, mettere opzioni dopo argomenti non-opzione va contro la convenzione sh / bash. In genere, i primi argomenti che non iniziano con un trattino indicano la fine delle opzioni e tutti gli argomenti successivi che iniziano con un trattino non sono considerati opzioni. Non tutti i programmi aderiscono a questa convenzione, ma se lo fai la vita è molto più semplice. :)
PM 2Ring

@SteveJorgensen: (cont) Questo argomento è brevemente discusso in Perché alcune utility analizzano gli operandi prima delle opzioni? . Come menziona il commento di Gilles alla risposta di Celada, alcuni programmi (come find) potrebbero sembrare che consentano opzioni dopo non opzioni, ma non lo sono: hanno operandi che iniziano con un trattino.
PM 2Ring

Grazie per quell'informazione (e la modifica) @mosvy È piuttosto insolito IFS, ma è meglio prevenire che curare. ;)
PM 2Ring

@roaima if IFS=0123456789, shift $((OPTIND-1))(senza virgolette) si trasformerà in shift ""cui verrà silenziosamente ignorato (in ksh) o genererà un errore (in bashe dash).
mosvy

8

$((...))calcola solo cose. Nel tuo caso prende il valore $optinte i substrati 1.

shiftrimuove i parametri posizionali. Nel tuo caso rimuove i optint-1parametri.

Per maggiori informazioni date un'occhiata a help getopts, help shift, sguardo man bashper "Espansione aritmetica", e in particolare Google per getopts.

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.