Нашел ответ на суперпользователе: https://superuser.com/questions/566082/less-doesnt-highlight-search
Похоже, это связано с настройкой TERM. Например, в обычном окне терминала gnome обычно действует меньшее выделение (белый фон), но когда я нахожусь в tmux, отображается курсив. Разница для меня в том, что TERM установлен на "screen", когда в tmux, но на "xterm-256color", когда нет. Когда я устанавливаю «TERM = xterm-256color» в окне tmux, выделение меньшим цветом возвращается к выделению фона.
Простой тест регулярного выражения, например
[[ " ${all[@]} " =~ " $site " ]] && echo in || echo out
может быть достаточно. Однако вы можете захотеть защититься от ложных срабатываний.
И, судя по тому, как вы оцениваете подтверждение, он закроет скрипт с кодом выхода ошибки, если вы введете y
, Y
или yes
в любой комбинации верхнего и нижнего регистра.
(Я предполагаю, что вы изменили if [[ "${site}" == "${all[@]}" ]]
на if [[ "$site" == "$item" ]]
.)
Только представьте, как выполняется ваш цикл. Предположим, вы набираете b
. Первая итерация цикла устанавливает item
равным a
. Вы сравниваете b
с a
. Если бы они были равны, вы бы сообщили о проверке. Но они не равны, поэтому вы сообщаете о неудаче и уходите.
Не лучше, если вы напечатаете a
. На первой итерации цикла item
равно a
, и вы сообщаете об успехе и продолжаете цикл . Затем item
становится b
, и вы переходите к пункту else
, где вы сообщаете об отказе и выходе.
Проблема в том, что вы сообщаете об ошибке, если ввод отличается от любого из допустимых значений. Но любой ввод будет отличаться как минимум от двух допустимых значений. (недопустимые входные данные будут отличаться от всех трех ). Вам нужно сообщить об успехе, если ввод равен любому из допустимых значений, и провал в противном случае.
То, как именно вы это сделаете, зависит от общей картины. Если чтение ввода и его проверка — этовсе , что вы хотите сделать, вам нужно лишь небольшое изменение вашего текущего кода:
for item in "${all[@]}"; do
echo "$item"
if [[ "$site" == "$item" ]]; then
echo "Site Name validated" && exit 0
fi
done
echo "No Match For Site Name" && exit 1
Но если (как это вероятно )вы хотите, чтобы скрипт продолжался и делал что-то с допустимым вводом, хороший способ — использовать флаг:
valid=
for item in "${all[@]}"; do
echo "$item"
if [[ "$site" == "$item" ]]; then
echo "Site Name validated" && valid=1
fi
done
if ! [ "$valid" ]
then
echo "No Match For Site Name" && exit 1
fi
# (script continues with valid input)
︙
П.С. Вам не нужно говорить "${site}"
в этом контексте; "$site"
в порядке.