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:
- Analizza il comando:questo è il
[[ … ]]
costrutto condizionale attorno all'espressione condizionale$a == z*
. - Analizza l'espressione condizionale:questo è il
==
operatore binario, con gli operandi$a
ez*
. - Espandi il primo operando nel valore della variabile
a
. - Valuta il
==
operatore:verifica se il valore della variabilea
corrisponde al modelloz*
. - Valuta l'espressione condizionale:il suo risultato è il risultato dell'operatore condizionale.
- 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:
- Analizza il comando:questo è il
[
comando con gli argomenti formati valutando le parole$a
,==
,z*
,]
. - Espandi
$a
nel valore della variabilea
. - 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 caratterifoo b*
(ottenuto ad es. daa='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
,]
.
- Ad esempio, se il valore di
- 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.
- Con i valori di esempio sopra,
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 =~
).