Como eu mudo o caso (maiúsculas e minúsculas) de strings na minha variável?

1
"Enter test: "
read test

if [[ $test == "a" ]]; then
    echo "worked"
else
    echo "failed"
fi

É uma ilustração simples do teste que estou fazendo, mas se eu digitar "A", ele falhará. Existe alguma coisa que eu possa fazer no estágio variável para mudar tudo para small case, para que o teste seja igual?

    
por Zac 22.01.2015 / 14:20

4 respostas

5

Existem várias maneiras úteis de conseguir isso (em bash ):

dois cheques

echo -n "Enter test: "
read test

if [[ $test == "a" || $test == "A" ]]; then
    echo "worked"
else
    echo "failed"
fi

faça a entrada em minúsculas

echo -n "Enter test: "
read test
test="${test,,}"

if [[ $test == "a" ]]; then
    echo "worked"
else
    echo "failed"
fi

regex para ambos os casos

echo -n "Enter test: "
read test

if [[ $test =~ ^[aA]$ ]]; then
    echo "worked"
else
    echo "failed"
fi

faça o shell ignorar o caso

echo -n "Enter test: "
read test

shopt -s nocasematch
if [[ $test == a ]]; then
    echo "worked"
else
    echo "failed"
fi
    
por 22.01.2015 / 14:30
7

Use apenas a sintaxe padrão sh (POSIX e Bourne):

case $answer in
  a|A) echo OK;;
  *)   echo >&2 KO;;
esac

Ou:

case $answer in
  [aA]) echo OK;;
  *)    echo >&2 KO;;
esac

Com bash , ksh ou zsh (as três shells que suportam essa sintaxe% padrão[[...]]), você pode declarar uma variável minúscula :

typeset -l test
printf 'Enter test: '
read test
if [ "$test" = a ]; then...

(lembre-se de que a conversão do caso de bash é falsa em algumas localidades).

    
por 22.01.2015 / 14:52
2

Existem várias maneiras de fazer isso. Se você está usando uma versão recente do bash, é bem fácil: você pode converter o caso de test , ou você pode usar um regex para combinar com o superior & minúsculas a.

Primeiro, a forma regex:

read -p "enter test: " test;[[ $test =~ ^[Aa]$ ]] && echo yes || echo no

Agora, o deslocador de maiúsculas e minúsculas:

read -p "enter test: " test;[[ ${test^^} = A ]] && echo yes || echo no
    
por 22.01.2015 / 14:31
1
sed -ne '/^[aA]$/!i\' -e failed -e 's//worked/p;q' </dev/tty
    
por 22.01.2015 / 17:43