glob / split
Prenderò prima il glob / split. @ La risposta di Stephane a cui ti sei collegato sta usando quei termini in senso generale. Non sono comandi reali o cose del genere, solo operazioni pseudo.
L' split("$test")
avrebbe diviso il contenuto di "$ test" sopra un "allineamento" di elementi.
Il glob(...)
impiegherebbe poi cura per espandere qualsiasi di questi elementi contenenti caratteri shell glob come *
o intervalli [1-2]
.
Esempio
Supponiamo che la nostra stringa $test
sia la seguente.
$ test="afile[1-2] afile[3-5]"
Diciamo anche che abbiamo una directory con alcuni file al suo interno.
$ ls -1
afile1
afile2
afile3
afile4
afile5
Ora, se proviamo a fare eco senza virgolette, dovresti notare che la nostra stringa si è divisa in spazi e quindi tutti i personaggi globbing si espandono.
$ echo $test
afile1 afile2 afile3 afile4 afile5
Tuttavia, se dovessimo citare la variabile quando l'abbiamo passata come argomento echo
, otterremmo la stringa letterale originale.
$ echo "$test"
afile[1-2] afile[3-5]
espansione variabile
Il termine espansione variabile intende indicare l'operazione di base che la shell sta eseguendo come parte delle sue operazioni di base. La shell è responsabile dell'analisi dell'input e quindi dell'esecuzione di questo input una volta ritenuto sintatticamente corretto.
Nel nostro esempio precedente. Quando la variabile è $test
stata presentata a echo
non quotata, dicevamo alla shell di andare avanti e dividere quegli argomenti e poi globarli.
Quando è stato citato, essenzialmente disabilitavamo quella funzione con qualsiasi variabile che avessimo racchiusa tra virgolette doppie.
Esempio
Ecco alcuni esempi aggiuntivi di globbing e divisione.
glob / split avviene automaticamente
$ echo file{1..3}
file1 file2 file3
$ echo file{1..3} dir{a..b}
file1 file2 file3 dira dirb
$ echo dir{z..w} file{A..D}
dirz diry dirx dirw fileA fileB fileC fileD
$ echo dir{z..w} file{A..B} fileC
dirz diry dirx dirw fileA fileB fileC
glob / splitting disabilitato tramite virgolette doppie
$ echo "dir{z..w} file{A..B} fileC"
dir{z..w} file{A..B} fileC
$ echo "dir{z..w} file{A..B}"
dir{z..w} file{A..B}