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 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, inizializzandonamese non esiste e l'indice dell'argomento successivo da elaborare nella variabileOPTIND.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 variabileOPTARG. La shell non si reimpostaOPTINDautomaticamente; deve essere reimpostato manualmente tra più chiamategetoptsall'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ù argomentiargs,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))"
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 bashe dash).
$((...))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.