а также

у, что диапазоны скобок BASH (например, [A-Z]) ведут себя неожиданно.
Есть ли объяснение такого поведения, или это ошибка?

Допустим, у меня есть переменная, из которой я хочу убрать все заглавные буквы:

$ var='ABCDabcd0123'
$ echo "${var//[A-Z]/}"

В результате я получаю это:

a0123

Если я сделаю это сsedЯ получаю ожидаемый результат:

$ echo "${var}" | sed 's/[A-Z]//g'
abcd0123

То же самое можно сказать и о совпадении регулярных выражений в BASH:

$ [[ a =~ [A-Z] ]] ; echo $?
1
$ [[ b =~ [A-Z] ]] ; echo $?
0

Если я проверяю все строчные буквы от «а» до «z», кажется, что только «а» является исключением:

$ for l in {a..z}; do [[ $l =~ [A-Z] ]] || echo $l; done
a

У меня не включено сопоставление без учета регистра, и даже если бы я это сделал, это не должно заставить букву «а» вести себя иначе:

$ shopt -p nocasematch
shopt -u nocasematch

Для справки, я использую Cygwin, и я не вижу такого поведения на любой другой машине:

$ uname
CYGWIN_NT-6.3
$ bash --version | head -1
GNU bash, version 4.3.46(7)-release (x86_64-unknown-cygwin)
$ locale
LANG=en_GB.UTF-8
LC_CTYPE="en_GB.UTF-8"
LC_NUMERIC="en_GB.UTF-8"
LC_TIME="en_GB.UTF-8"
LC_COLLATE="en_GB.UTF-8"
LC_MONETARY="en_GB.UTF-8"
LC_MESSAGES="en_GB.UTF-8"
LC_ALL=

РЕДАКТИРОВАТЬ:

Я обнаружил точно такую ​​же проблему, о которой сообщалось здесь:https://bugs.launchpad.net/ubuntu/+source/bash/+bug/120687
Итак, я полагаю, что это ошибка (?) Сопоставления en_GB.UTF-8, но не сама BASH.
настройкаLC_COLLATE=C действительно решает это.

Ответы на вопрос(1)

Ваш ответ на вопрос