2

Я пишу сценарий оболочки и столкнулся с каким-то странным поведением.

Мой вопрос прост: почему [[ "╝" = [█] ]] оценивается как истина? Это потому что они оба необычные персонажи ascii? На моем Mac это оценивает нормально.

примечание:█ должно быть в скобках.

1 ответ1

2

Оценка не зависит от платформы (Mac или другой). Это зависит от текущих настроек локали:

$ LANG=C
$ if [[ "╝" = [█] ]]; then echo y; else echo n; fi
n
$ LANG=en_US.UTF-8
$ if [[ "╝" = [█] ]]; then echo y; else echo n; fi
y

Мы можем попытаться определить, какие локали соответствуют выражению, с помощью простого скрипта:

for i in $(locale -a)
do
   export LANG=$i
   echo -n "LANG=$LANG   "
   if [[ "╝" = [█] ]]; then echo yes; else echo no; fi
done

и увидите, что локали UTF-8 соответствуют выражению. Когда для локали установлено значение UTF-8, bash интерпретирует символы UTF-8 по-разному, и это является причиной того, что результат отличается.

Тем не менее, я думаю, что это ошибка, потому что она должна возвращать false, даже если установлена локаль с поддержкой UTF-8.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .