Come modificare un argomento della riga di comando in Bash?


92

C'è un modo per modificare gli argomenti della riga di comando in uno script Bash. Supponiamo, ad esempio, che uno script Bash venga richiamato nel modo seguente:

./foo arg1 arg2  

C'è un modo per modificare il valore di arg1 all'interno dello script? Di 'qualcosa di simile

$1="chintz"

Risposte:


147

Devi resettare tutti gli argomenti. Per cambiare ad esempio $3:

$ set -- "${@:1:2}" "new" "${@:4}"

Fondamentalmente imposti tutti gli argomenti ai loro valori correnti, ad eccezione di quelli che desideri modificare. set --è specificato anche da POSIX 7 .

La "${@:1:2}"notazione è espansa ai due (da qui 2la notazione nella notazione) argomenti posizionali a partire da offset 1(cioè $1). È un'abbreviazione per "$1" "$2"in questo caso, ma è molto più utile quando si desidera sostituire ad es "${17}".


1
quindi, per cambiare $ 3, devo cambiare anche $ 1 e $ 2, vero? E cambiarli in cosa? Cosa significa "reset"?
Sriram

Grazie per il trucco! Ho avuto difficoltà a utilizzarlo per i nomi di file con spazi incorporati. Per chiunque altro possa incorrere in quel problema, prova a metterlo evalin prima linea per questo .
cxw

2
Questo va bene quando conosci la posizione del parametro che vuoi cambiare. E se in realtà non lo sapessi e avessi bisogno di cambiarlo dinamicamente? Ho provato con $ set - "$ {: 1: $ pivot}" ma non accetta una variabile lì.
Daniele Segato

1
Come posso fare la stessa cosa dall'interno di una funzione? La tua soluzione non sembra funzionare quando invocata dall'interno di una funzione.
Hashken

2
Non è possibile modificare i parametri posizionali di uno script dall'interno di una funzione: gli argomenti della funzione li nascondono. È tuttavia possibile memorizzarli in un array e operare su quello.
thkala

22

Ottimizzando la leggibilità e la manutenibilità, potrebbe essere meglio assegnare $1e $2a variabili più significative (non lo so, input_filename = $1e output_filename = $2o qualcosa del genere) e poi sovrascrivere una di quelle variabili ( input_filename = 'chintz'), lasciando invariato l'input allo script, nel caso lo sia necessario altrove.


Volevo un approccio in cui potessi modificare uno degli argomenti di input stesso. Avevo bisogno di farlo poiché volevo restituire un valore dallo script. La risposta suggerita da thkala ha funzionato bene. Grazie per la risposta!!!
Sriram

3
@Johnsyweb d'accordo. Per motivi di leggibilità, il tuo è il metodo migliore.
Dss

1
"Stai meglio" dipende sempre dal caso d'uso, che non viene fornito.
Scott

2
@Scott 7 anni in più e più esperienza di me quando ho scritto questa risposta, sono propenso a essere d'accordo con te.
Johnsyweb

Esempio in cui questo non funzionerebbe (a parte l'utilizzo di qualcosa come $ FIRST_PARAMETER): avere l'uso e il significato del parametro a seconda del valore effettivo.
Igor Stoppa
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.