Questo post contiene in realtà due domande separate, ma penso che raggrupparle insieme darà un po' più di contesto. Ho esaminato questa domanda sulle virgolette attorno alle variabili, ma non capisco esattamente quale espansione della variabile significa in primo luogo. Quindi la mia prima domanda è :
- Che cos'è l'espansione variabile in unix/linux parli?
Una seconda parte della mia domanda riguarda i seguenti termini :
- globo
- dividi
Cosa significano quanto sopra e come influiscono sull'espansione delle variabili? La risposta alla domanda originale menziona quanto segue:
Pensa all'assenza di virgolette (nei contesti di elenco) come all'operatore split+glob
.
Come se echo $test fosse echo glob(split(“$test”)).
Non sono riuscito a trovare alcuna risposta che affronti direttamente il concetto di globbing e divisione ma usa questi termini direttamente per rispondere ad altre domande come questa recente.
Risposta accettata:
Espansione variabile (il termine standard è espansione dei parametri , ed è anche chiamata sostituzione di variabili ) significa sostanzialmente sostituire la variabile con il suo valore. Più precisamente, significa sostituire il $VARIABLE
costrutto (o ${VARIABLE}
o ${VARIABLE#TEXT}
o altri costrutti) da qualche altro testo che è costruito dal valore della variabile. Questo altro testo è l'espansione della variabile.
Il processo di espansione è il seguente. (Discuto solo del caso comune, alcune impostazioni ed estensioni della shell modificano il comportamento.)
- Prendi il valore della variabile, che è una stringa. Se la variabile non è definita, usa la stringa vuota.
- Se il costrutto include una trasformazione, applicala. Ad esempio, se il costrutto è
${VARIABLE#TEXT}
e il valore della variabile inizia conTEXT
, rimuoviTEXT
dall'inizio del valore. - Se il contesto richiede una singola parola (ad esempio tra virgolette, o nella parte destra di un compito, o all'interno di un documento here), fermati qui. Altrimenti continua con i passaggi successivi.
- Dividi il valore in parole separate in ciascuna sequenza di spazi bianchi. (La variabile
IFS
può essere modificato per dividere in caratteri diversi dagli spazi bianchi.) Il risultato quindi non è più una stringa, ma un elenco di stringhe. Questo elenco può essere vuoto se il valore contiene solo spazi bianchi. - Tratta ogni elemento dell'elenco come un modello di caratteri jolly del nome file, ovvero un glob . Se il modello corrisponde ad alcuni file, viene sostituito dall'elenco dei nomi di file corrispondenti, altrimenti viene lasciato solo.
Ad esempio, supponiamo che la variabile foo
contiene a* b* c*
e la directory corrente contiene i file bar
, baz
e paz
. Quindi ${foo#??}
è ampliato come segue:
- Il valore della variabile è la stringa di 8 caratteri
a* b* c*
. #??
significa rimuovere i primi due caratteri, risultando nella stringa di 6 caratterib* c*
(con uno spazio iniziale).- Se l'espansione è in un contesto di elenco (cioè non tra virgolette o altro contesto simile), continua.
- Dividi la stringa in parole delimitate da spazi bianchi, ottenendo un elenco di due stringhe:
b*
ec*
. - La stringa
b*
, interpretato come un pattern, corrisponde a due file:bar
ebaz
. La stringac*
non corrisponde a nessun file, quindi viene lasciato solo. Il risultato è un elenco di tre stringhe:bar
,baz
,c*
.
Ad esempio echo ${foo#??}
stampa bar baz c*
(il comando echo
unisce i suoi argomenti con uno spazio in mezzo).
Per maggiori dettagli, vedere:
- Espansione dei parametri nello standard POSIX, seguita dalla suddivisione dei campi e dall'espansione del percorso
- Espansione dei parametri della shell nel manuale di bash, seguita dalla divisione delle parole e dall'espansione dei nomi dei file
- $VAR vs ${VAR} e per citare o non citare
- Quando è necessaria la doppia virgoletta?