Bash,, и ^^ конверсии не совпадают с шаблонами
Я экспериментировал с внутренним преобразованием дел в bash и обнаружил несоответствия.
Я определяю переменную со значением "aBcDeF" и пытаюсь преобразовать первый символ верхнего регистра в диапазоне [AD] в нижний регистр. Я ожидаю результата "abcDeF", но вместо этого получаю:
$ lowerFirst=aBcDeF
$ echo ${lowerFirst,[A-D]}
aBcDeF
Кажется, он соответствует строчной букве "а", видя, что это строчная буква, и заключая, что делать нечего.
На странице руководства bash написано
${parameter,pattern}
Шаблон расширяется, чтобы создать шаблон так же, как в расширении имени файла. Каждый символ в расширенном значении параметра проверяется на соответствие шаблону, и, если он соответствует шаблону, его регистр преобразуется. Шаблон не должен пытаться соответствовать более чем одному символу.
Это привело меня к изучению раздела о расширении имени файла, который кажется довольно ясным, что должно быть совпадение с первым заглавным символом.
Это заставило меня задуматься о преобразовании кейса, и, как правило, все работает не так, как указывает справочная страница.
Мой сценарий:
lowerFirst=aBcDeF
upperFirst=AbCdEf
echo 'lowerFirst=aBcDeF'
echo 'upperFirst=AbCdEf'
echo
echo 'Original Converted Expected Conversion'
echo "${lowerFirst} ${lowerFirst,[A-D]} abcDeF "'${lowerFirst,[A-D]}'
echo "${upperFirst} ${upperFirst,[A-D]} abCdEf "'${upperFirst,[A-D]}'
echo "${lowerFirst} ${lowerFirst,[a-d]} aBcDeF "'${lowerFirst,[a-d]}'
echo "${upperFirst} ${upperFirst,[a-d]} AbCdEf "'${upperFirst,[a-d]}'
echo "${lowerFirst} ${lowerFirst^[A-D]} aBcDeF "'${lowerFirst^[A-D]}'
echo "${upperFirst} ${upperFirst^[A-D]} AbCdEf "'${upperFirst^[A-D]}'
echo "${lowerFirst} ${lowerFirst^[a-d]} abcDeF "'${lowerFirst^[a-d]}'
echo "${upperFirst} ${upperFirst^[a-d]} abCdEf "'${upperFirst^[a-d]}'
echo
echo "${lowerFirst} ${lowerFirst,,[A-D]} abcdeF "'${lowerFirst,,[A-D]}'
echo "${upperFirst} ${upperFirst,,[A-D]} abcdEf "'${upperFirst,,[A-D]}'
echo "${lowerFirst} ${lowerFirst,,[a-d]} aBcDeF "'${lowerFirst,,[a-d]}'
echo "${upperFirst} ${upperFirst,,[a-d]} AbCdEf "'${upperFirst,,[a-d]}'
echo "${lowerFirst} ${lowerFirst^^[A-D]} aBcDeF "'${lowerFirst^^[A-D]}'
echo "${upperFirst} ${upperFirst^^[A-D]} AbCdEf "'${upperFirst^^[A-D]}'
echo "${lowerFirst} ${lowerFirst^^[a-d]} ABCDeF "'${lowerFirst^^[a-d]}'
echo "${upperFirst} ${upperFirst^^[a-d]} ABCDEf "'${upperFirst^^[a-d]}'
Это дает:
lowerFirst=aBcDeF
upperFirst=AbCdEf
Original Converted Expected Conversion
aBcDeF aBcDeF abcDeF ${lowerFirst,[A-D]}
AbCdEf abCdEf abCdEf ${upperFirst,[A-D]}
aBcDeF aBcDeF aBcDeF ${lowerFirst,[a-d]}
AbCdEf AbCdEf AbCdEf ${upperFirst,[a-d]}
aBcDeF aBcDeF aBcDeF ${lowerFirst^[A-D]}
AbCdEf AbCdEf AbCdEf ${upperFirst^[A-D]}
aBcDeF ABcDeF abcDeF ${lowerFirst^[a-d]}
AbCdEf AbCdEf abCdEf ${upperFirst^[a-d]}
aBcDeF abcdeF abcdeF ${lowerFirst,,[A-D]}
AbCdEf abcdEf abcdEf ${upperFirst,,[A-D]}
aBcDeF aBcDeF aBcDeF ${lowerFirst,,[a-d]}
AbCdEf AbCdEf AbCdEf ${upperFirst,,[a-d]}
aBcDeF aBcDeF aBcDeF ${lowerFirst^^[A-D]}
AbCdEf AbCdEf AbCdEf ${upperFirst^^[A-D]}
aBcDeF ABCDeF ABCDeF ${lowerFirst^^[a-d]}
AbCdEf ABCDEf ABCDEf ${upperFirst^^[a-d]}
Если я спрашиваю версию Bash, я получаю:
$ bash --version
GNU bash, version 4.4.19(1)-release (x86_64-pc-linux-gnu)
Я правильно интерпретирую это? Если нет, то что я делаю не так?
1 ответ
Руководство по bash гласит:
^^
а также,,
расширения преобразуют каждый соответствующий символ в расширенное значение;^
а также,
расширения соответствуют и преобразуют только первый символ в расширенном значении.
,
преобразует первый символ в нижний регистр, если он соответствует шаблону. ,,
преобразует все соответствующие символы. Нет способа конвертировать только первый соответствующий символ.