GNU/Linux >> Linux Esercitazione >  >> Linux

La differenza tra [[ $a ==Z* ]] e [ $a ==Z* ]?

C'è qualche differenza tra questi due.

[[ $a == z* ]]

e

[ $a == z* ] 

Posso avere un esempio in cui avrebbero output diversi?

Inoltre, come funziona il funzionamento di [[ ]] differisce da [ ] ?

Risposta accettata:

La differenza tra [[ … ]] e [ … ] è per lo più trattato in Perché l'espansione dei parametri con spazi senza virgolette funziona tra parentesi doppie “[[” ma non tra parentesi singole “[“?.
Fondamentalmente, [[ … ]] è una sintassi speciale, mentre [ è un nome strano per un comando. [[ … ]] ha regole di sintassi speciali per ciò che c'è dentro, [ … ] no.

Con l'aggiunta di un carattere jolly, ecco come [[ $a == z* ]] viene valutato:

  1. Analizza il comando:questo è il [[ … ]] costrutto condizionale attorno all'espressione condizionale $a == z* .
  2. Analizza l'espressione condizionale:questo è il == operatore binario, con gli operandi $a e z* .
  3. Espandi il primo operando nel valore della variabile a .
  4. Valuta il == operatore:verifica se il valore della variabile a corrisponde al modello z* .
  5. Valuta l'espressione condizionale:il suo risultato è il risultato dell'operatore condizionale.
  6. Il comando è ora valutato, il suo stato è 0 se l'espressione condizionale era vera e 1 se era falsa.

Ecco come [ $a == z* ] viene valutato:

  1. Analizza il comando:questo è il [ comando con gli argomenti formati valutando le parole $a , == , z* , ] .
  2. Espandi $a nel valore della variabile a .
  3. Esegui la suddivisione delle parole e la generazione di nomi di file sui parametri del comando.
    • Ad esempio, se il valore di a è la stringa di 6 caratteri foo b* (ottenuto ad es. da a='foo b*' ) e l'elenco dei file nella directory corrente è (bar , baz , qux , zim , zum ), il risultato dell'espansione è il seguente elenco di parole:[ , foo , bar , baz , == , zim , zum , ] .
  4. Esegui il comando [ con i parametri ottenuti nel passaggio precedente.
    • Con i valori di esempio sopra, [ comando lamenta un errore di sintassi e restituisce lo stato 2.

Nota:in [[ $a == z* ]] , al passaggio 3, il valore di a non subisce la suddivisione in parole e la generazione di nomi di file, perché è in un contesto in cui è prevista una singola parola (l'argomento di sinistra dell'operatore condizionale == ). Nella maggior parte dei casi, se una singola parola ha senso in quella posizione, l'espansione variabile si comporta come tra virgolette. Tuttavia, c'è un'eccezione a questa regola:in [[ abc == $a ]] , se il valore di a contiene caratteri jolly, quindi abc viene confrontato con il modello di caratteri jolly. Ad esempio, se il valore di a è a* quindi [[ abc == $a ]] è vero (perché il carattere jolly * proveniente dall'espansione non quotata di $a corrisponde a bc ) mentre [[ abc == "$a" ]] è falso (perché il carattere ordinario * proveniente dall'espansione citata di $a non corrisponde a bc ). Dentro [[ … ]] , le virgolette doppie non fanno la differenza, tranne sul lato destro degli operatori di corrispondenza delle stringhe (= , == , != e =~ ).

Correlati:stampa Riga di corrispondenza e riga ennesima dalla riga di corrispondenza?
Linux
  1. Qual è la differenza tra InnoDB e MyISAM?

  2. La differenza tra Getty e Agety?

  3. La differenza tra ~/.profile e ~/.bash_profile?

  4. La differenza tra Nss e Pam?

  5. La differenza tra Lubuntu e Lxde?

Qual è la differenza tra Linux e Unix?

La differenza tra "env" e "printenv"?

Che cos'è un hypervisor? Qual è la differenza tra il tipo 1 e 2?

Qual è la differenza tra curl e Wget?

Qual è la differenza tra strtok_r e strtok_s in C?

Qual è la differenza tra adduser e useradd?