Não é necessário usar o comando ksh
-style [[...]]
, você pode usar a construção padrão sh
case
aqui:
case $LINUX_CONF in
([Nn][Oo]) echo linux;;
(*) echo not linux;;
esac
Ou nomeando cada caso possível individualmente:
case $LINUX_CONF in
(No | nO | NO | no) echo linux;;
(*) echo not linux;;
esac
Para uma maneira específica de bash
de fazer correspondência não diferencia maiúsculas de minúsculas, você pode fazer:
shopt -s nocasematch
[[ $LINUX_CONF = no ]] && echo linux
Ou:
[[ ${LINUX_CONF,,} = no ]] && echo linux
(onde ${VAR,,}
é a sintaxe para converter uma string em minúscula).
Você também pode forçar uma variável a ser convertida em minúscula após a atribuição com:
typeset -l LINUX_CONF
Isso também vem do ksh e também é suportado por bash
e zsh
.
Mais variantes com outras shells:
zsh
set -o nocasematch
[[ $LINUX_CONF =~ no ]] && echo linux
(o mesmo que em bash
).
setopt extendedglob
[[ $LINUX_CONF = (#i)no ]] && echo linux
(menos perigoso do que fazer all não diferencia maiúsculas de minúsculas)
[[ ${(L)LINUX_CONF} = no ]] && echo linux
(converter para operador de minúsculas)
set -o rematchpcre
[[ $LINUX_CONF =~ (?i)no ]]
(sintaxe PCRE)
ksh93
[[ $LINUX_CONF = ~(i)no ]]
ou
[[ $LINUX_CONF = ~(i:no) ]]
Observe que todas as abordagens acima que não sejam [nN][oO]
para fazer correspondência insensível a maiúsculas e minúsculas dependem da localidade do usuário. Nem todas as pessoas ao redor do mundo concordam com o que é a versão em maiúscula de uma determinada letra, mesmo para as ASCII.
Na prática para os ASCII, pelo menos nos sistemas GNU, os desvios das regras inglesas parecem estar limitados às letras i
e I
e se o ponto está lá ou não na versão maiúscula ou minúscula .
O que isso significa é que [[ ${VAR,,} = oui ]]
não é garantido para corresponder em OUI
em cada local (mesmo quando O bug nas versões atuais de bash
está corrigido).