"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