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))
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))
Risposte:
shift $((OPTIND-1))
(la nota OPTIND
è maiuscola) normalmente si trova immediatamente dopo un getopts
while
ciclo. $OPTIND
è il numero di opzioni trovate da getopts
.
Come menziona pauljohn32 nei commenti, in senso stretto, OPTIND
fornisce la posizione del prossimo argomento della riga di comando.
Dal manuale di riferimento di GNU Bash :
getopts optstring name [args]
getopts
viene utilizzato dagli script della shell per analizzare i parametri posizionali.optstring
contiene 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,getopts
inserisce l'opzione successiva nel nome della variabile della shell, inizializzandoname
se non esiste e l'indice dell'argomento successivo da elaborare nella variabileOPTIND
.OPTIND
viene inizializzato su 1 ogni volta che viene invocato lo script shell o shell. Quando un'opzione richiede un argomento, getopts inserisce tale argomento nella variabileOPTARG
. La shell non si reimpostaOPTIND
automaticamente; deve essere reimpostato manualmente tra più chiamategetopts
all'interno della stessa invocazione della shell se si desidera utilizzare un nuovo set di parametri.Quando viene rilevata la fine delle opzioni,
getopts
esce con un valore di ritorno maggiore di zero.OPTIND
è impostato sull'indice del primo argomento non opzionale e il nome è impostato su '?'.
getopts
analizza normalmente i parametri posizionali, ma se vengono forniti più argomentiargs
,getopts
analizza invece quelli.
shift
n
rimuove n stringhe dall'elenco dei parametri posizionali. shift $((OPTIND-1))
Rimuove così tutte le opzioni che sono state analizzate getopts
dall'elenco dei parametri, e quindi dopo quel punto, $1
farà 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))"
find
) potrebbero sembrare che consentano opzioni dopo non opzioni, ma non lo sono: hanno operandi che iniziano con un trattino.
IFS
, ma è meglio prevenire che curare. ;)
IFS=0123456789
, shift $((OPTIND-1))
(senza virgolette) si trasformerà in shift ""
cui verrà silenziosamente ignorato (in ksh
) o genererà un errore (in bash
e dash
).
$((...))
calcola solo cose. Nel tuo caso prende il valore $optint
e i substrati 1.
shift
rimuove i parametri posizionali. Nel tuo caso rimuove i optint-1
parametri.
Per maggiori informazioni date un'occhiata a help getopts
, help shift
, sguardo man bash
per "Espansione aritmetica", e in particolare Google per getopts
.