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$aez*. - Espandi il primo operando nel valore della variabile
a. - Valuta il
==operatore:verifica se il valore della variabileacorrisponde 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
$anel 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 =~ ).