Caso standard
Non c'è bisogno di usare quel ksh
-style [[...]]
comando, puoi usare il comando standard sh
case
costruire qui:
case $LINUX_CONF in
([Nn][Oo]) echo linux;;
(*) echo not linux;;
esac
O nominando individualmente ogni possibile caso:
case $LINUX_CONF in
(No | nO | NO | no) echo linux;;
(*) echo not linux;;
esac
bash
Per un bash
-modo specifico per eseguire la corrispondenza senza distinzione tra maiuscole e minuscole, puoi eseguire:
shopt -s nocasematch
[[ $LINUX_CONF = no ]] && echo linux
Oppure:
[[ ${LINUX_CONF,,} = no ]] && echo linux
(dove ${VAR,,}
è la sintassi per convertire una stringa in lettere minuscole).
Puoi anche forzare la conversione di una variabile in minuscolo al momento dell'assegnazione con:
typeset -l LINUX_CONF
Anche questo deriva da ksh ed è supportato anche da bash
e zsh
.
Altre varianti con altre shell:
zsh
set -o nocasematch
[[ $LINUX_CONF = no ]] && echo linux
(come in bash
).
setopt extendedglob
[[ $LINUX_CONF = (#i)no ]] && echo linux
(meno pericoloso che creare tutto corrisponde alla distinzione tra maiuscole e minuscole)
[[ ${(L)LINUX_CONF} = no ]] && echo linux
(converti in operatore minuscolo)
set -o rematchpcre
[[ $LINUX_CONF =~ '^(?i)no\z' ]]
(sintassi PCRE)
ksh93
[[ $LINUX_CONF = ~(i)no ]]
o
[[ $LINUX_CONF = ~(i:no) ]]
Nota che tutti gli approcci precedenti tranne [nN][oO]
per eseguire la corrispondenza senza distinzione tra maiuscole e minuscole dipende dalle impostazioni locali dell'utente. Non tutte le persone in tutto il mondo sono d'accordo su quale sia la versione maiuscola di una determinata lettera, anche per quelle ASCII.
In pratica per quelli ASCII, almeno sui sistemi GNU, le deviazioni dalle regole inglesi sembrano essere limitate al i
e I
lettere e se il punto è presente o meno nella versione maiuscola o minuscola.
Ciò significa che [[ ${VAR,,} = oui ]]
non è garantito che corrisponda a OUI
in ogni locale (anche quando il bug nelle versioni correnti di bash
è fisso).
Mantieni il tuo comando esistente ma in linea prima che esegua questo:
LINUX_CONF=$(echo $LINUX_CONF | awk '{ print tolower($0) }')
Indipendentemente dal caso del valore memorizzato nella variabile, questo forzerà il valore di sostituzione ad essere minuscolo. Ciò comporta la corrispondenza del comando esistente con una sola riga di codice aggiuntiva.