Espansione Bash Shell
Una delle operazioni della shell quando analizza l'input è l'espansione della shell. Bash fornisce diversi tipi di espansione. In questo articolo esaminiamo un'importante espansione:"Espansione del tutore".
Questo articolo fa parte della nostra serie di tutorial Bash in corso.
Espansione del tutore
L'espansione delle parentesi viene utilizzata per generare stringhe arbitrarie. L'espansione delle parentesi consente di creare più argomenti della riga di comando modificati da un singolo argomento. Le stringhe specificate vengono utilizzate per generare tutte le possibili combinazioni con i preamboli e i postscript facoltativi circostanti. Il preambolo è preceduto da ogni stringa contenuta tra parentesi graffe e il postscript viene quindi aggiunto a ciascuna stringa risultante, espandendosi da sinistra a destra.
$ echo last{mce,boot,xorg}.log lastmce.log lastboot.log lastxorg.log where last is Preamble and .log is the postscript
L'istruzione echo di cui sopra evita di specificare i tre file di registro separatamente. Se vuoi visualizzare il contenuto dell'ultimo log di avvio, log mce e log xorg puoi usare l'espansione brace come mostrato nell'istruzione echo sopra.
1. Esempio di backup con espansione parentesi graffa
$ cat bkup.sh set -x # expand the commands da=`date +%F` cp $da.log{,.bak} $ ./bkup.sh ++ date +%F + da=2010-05-28 + cp 2010-05-28.log 2010-05-28.log.bak
Nello script di backup sopra, copia il file di registro della data corrente con estensione .bak. Il primo elemento è vuoto tra parentesi graffe, quindi il primo elemento avrà solo il preambolo.
2. Esempio di ripristino utilizzando l'espansione delle parentesi graffe
$ cat restore.sh set -x # expand the commands da=`date +%F` cp $da.log{.bak,} $ ./restore.sh ++ date +%F + da=2010-05-28 + cp 2010-05-28.log.bak 2010-05-28.log
Nello script di ripristino, il primo elemento nel parametro è .bak dove come secondo elemento è vuoto.
Inoltre, fare riferimento al nostro precedente articolo sulle funzioni della shell bash per ulteriori letture.
3. Esempio di espansione del tutore senza preambolo e poscritto
Se non ci sono preamboli e postscript, espande semplicemente gli elementi indicati tra parentesi graffe.
$ cat expand.sh echo {oct,hex,dec,bin} $ ./expand.sh oct hex dec bin
Senza le stringhe di preambolo e postscript opzionali, il risultato è solo un elenco separato da spazi delle stringhe date
Espansione del rinforzo per le gamme
L'espansione del tutore espande anche le sequenze. Le sequenze possono essere di numeri interi o di caratteri.
4. Esempio per sequenze di numeri interi e di caratteri
$ cat sequence.sh cat /var/log/messages.{1..3} echo {a..f}{1..9}.txt $ ./sequence.sh May 9 01:18:29 x3 ntpd[2413]: time reset -0.132703 s May 9 01:22:38 x3 ntpd[2413]: synchronized to LOCAL(0), stratum 10 May 9 01:23:44 x3 ntpd[2413]: synchronized to May 9 01:47:48 x3 dhclient: DHCPREQUEST on eth0 May 9 01:47:48 x3 dhclient: DHCPACK from 23.42.38.201 .. .. a1.txt a2.txt a3.txt a4.txt b1.txt b2.txt b3.txt b4.txt c1.txt c2.txt c3.txt c4.txt
Il primo comando cat, espande i messaggi.1, i messaggi.2 e i messaggi.3 e visualizza il contenuto. e nella successiva istruzione echo le sequenze di caratteri e interi vengono combinate e utilizzate.
Sequenze con valore di incremento
Nell'espansione delle parentesi graffe di kshell, puoi utilizzare il valore di incremento per generare le sequenze.
Syntax: <start>..<end>..<incr>
incr è numerico. Puoi usare un numero intero negativo, ma il segno corretto viene dedotto dall'ordine di inizio e fine.
5. Esempio di utilizzo di Increment in sequenze
$ ksh $ echo /var/log/messages.{1..7..2} /var/log/messages.1 /var/log/messages.3 /var/log/messages.5 /var/log/messages.7 $
Usando questo puoi vedere i file di registro dei giorni alterni.
Trappola nell'espansione Brace
L'espansione della parentesi non espande le variabili bash, perché l'espansione della parentesi è il primo passo dell'espansione della shell, la variabile verrà espansa in seguito.
6. Esempio per variabili in espansione
Se vedi l'output delle seguenti due dichiarazioni for, potresti identificare l'insidia di cui sopra.
$ cat var_seq.sh # Print 1 to 4 using sequences. for i in {1..4} do echo $i done start=1 end=4 # Print 1 to 4 using through variables echo "Sequences expressed using variables" for i in {$start..$end} do echo $i done $ ./var_seq.sh 1 2 3 4 Sequences expressed using variables {1..4}