¿Cómo cambio las mayúsculas y minúsculas de las cadenas en mi variable?

¿Cómo cambio las mayúsculas y minúsculas de las cadenas en mi variable?
"Enter test: "
read test

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

Es una ilustración simple de la prueba que estoy haciendo, pero si ingreso "A", fallará. ¿Hay algo que pueda hacer en la etapa variable para cambiarlo todo a minúsculas, de modo que la prueba coincida?

Respuesta1

Simplemente use la shsintaxis estándar (POSIX y Bourne):

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

O:

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

Con bash, ksho zsh(los 3 shells que soportan esa sintaxis no estándar [[...]]), puedes declarar unminúsculavariable:

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

(tenga en cuenta que, bashen ese caso, la conversión es falsa en algunas regiones).

Respuesta2

Hay varias formas útiles de lograr esto (en bash):

dos cheques

echo -n "Enter test: "
read test

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

hacer la entrada en minúsculas

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

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

expresiones regulares para ambos casos

echo -n "Enter test: "
read test

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

hacer que el shell ignore el caso

echo -n "Enter test: "
read test

shopt -s nocasematch
if [[ $test == a ]]; then
    echo "worked"
else
    echo "failed"
fi

Respuesta3

Hay varias formas de hacer esto. Si está utilizando una versión reciente de bash, es bastante fácil: puede convertir el caso de testo puede usar una expresión regular para que coincida con a mayúscula y minúscula.

Primero la forma de expresiones regulares:

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

Ahora el cambio de caso:

read -p "enter test: " test;[[ ${test^^} = A ]] && echo yes || echo no

Respuesta4

sed -ne '/^[aA]$/!i\' -e failed -e 's//worked/p;q' </dev/tty

información relacionada