bash - correspondência de variável insensível a maiúsculas e minúsculas

3

Esta sintaxe imprime "linux" quando a variável é igual a "no":

 [[ $LINUX_CONF = no ]] && echo "linux"

Como eu usaria expressões regulares (ou similares) para tornar a comparação insensitiva?

    
por yael 02.10.2017 / 18:09

2 respostas

8

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).

    
por 02.10.2017 / 18:12
0

Mantenha seu comando existente, mas na linha antes de executar isso:

LINUX_CONF=$(echo $LINUX_CONF | awk '{ print tolower($0) }')

Independentemente do caso do valor armazenado em sua variável, isso forçará o valor de substituição a ser minúsculo. Isso resulta na correspondência do seu comando existente com apenas uma linha adicional de código.

    
por 03.10.2017 / 13:56