Как изменить регистр (верхний и нижний) строк в моей переменной?

Как изменить регистр (верхний и нижний) строк в моей переменной?
"Enter test: "
read test

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

Это простая иллюстрация теста, который я делаю, но если я введу "A", он провалится. Можно ли что-то сделать на этапе переменных, чтобы изменить все на small case, чтобы тест совпал?

решение1

Просто используйте стандартный sh(POSIX и Bourne) синтаксис:

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

Или:

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

С помощью bash, kshили zsh(3 оболочки, поддерживающие этот нестандартный [[...]]синтаксис) вы можете объявитьнижний регистрпеременная:

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

(имейте в виду, что bashв некоторых локалях преобразование регистра может быть поддельным).

решение2

Есть несколько полезных способов добиться этого (в bash):

два чека

echo -n "Enter test: "
read test

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

сделать ввод строчными буквами

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

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

регулярное выражение для обоих случаев

echo -n "Enter test: "
read test

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

заставить оболочку игнорировать регистр

echo -n "Enter test: "
read test

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

решение3

Есть несколько способов сделать это. Если вы используете последнюю версию bash, это довольно просто: вы можете преобразовать регистр test, или вы можете использовать регулярное выражение для соответствия как заглавным, так и строчным буквам a.

Сначала регулярные выражения:

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

Теперь смена регистра:

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

решение4

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

Связанный контент