GNU/Linux >> Linux Esercitazione >  >> Linux

Espansione di una variabile shell ed effetto di glob e split su di essa?

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 è :

  1. Che cos'è l'espansione variabile in unix/linux parli?

Una seconda parte della mia domanda riguarda i seguenti termini :

  1. globo
  2. 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.)

  1. Prendi il valore della variabile, che è una stringa. Se la variabile non è definita, usa la stringa vuota.
  2. Se il costrutto include una trasformazione, applicala. Ad esempio, se il costrutto è ${VARIABLE#TEXT} e il valore della variabile inizia con TEXT , rimuovi TEXT dall'inizio del valore.
  3. 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.
  4. 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.
  5. 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:

  1. Il valore della variabile è la stringa di 8 caratteri a* b* c* .
  2. #?? significa rimuovere i primi due caratteri, risultando nella stringa di 6 caratteri  b* c* (con uno spazio iniziale).
  3. Se l'espansione è in un contesto di elenco (cioè non tra virgolette o altro contesto simile), continua.
  4. Dividi la stringa in parole delimitate da spazi bianchi, ottenendo un elenco di due stringhe:b* e c* .
  5. La stringa b* , interpretato come un pattern, corrisponde a due file:bar e baz . La stringa c* 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).

Correlati:cosa NON mettere su un SSD?

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?

Linux
  1. Come impostare la tua variabile $PATH in Linux

  2. Differenza tra shell di accesso e shell non di accesso?

  3. Memorizzazione dell'output del comando nella variabile Shell?

  4. Come ottenere il proprio indirizzo IP e salvarlo in una variabile in uno script di shell?

  5. Differenza tra tubazioni ed espansione dei comandi?

5 modi per dividere il tuo terminale Linux

Come installare e utilizzare Nu Shell su Linux

Spiegazione del comando di esportazione in Linux

Che cos'è Subshell in Linux?

Ambito variabile per gli script e le funzioni della shell bash nello script

Differenza tra '{}' e {} nel comando find?