Bash ,, и ^^ конверсии не совпадают с шаблонами - PullRequest
0 голосов
/ 17 февраля 2019

Я экспериментировал с внутренним преобразованием регистра bash и обнаружил несоответствия.

Я определяю переменную со значением "aBcDeF" и пытаюсь преобразовать первый символ верхнего регистра в диапазоне [AD] в нижний регистр.Я ожидал бы результата "abcDeF", но вместо этого я получаю:

$ lowerFirst=aBcDeF
$ echo ${lowerFirst,[A-D]}
aBcDeF

Кажется, он соответствует строчной букве "a", видя, что это уже строчная буква и заключая, что делать нечего.

Страница man bash говорит

${parameter,pattern}  

Шаблон расширяется, чтобы создать шаблон так же, как в расширении имени файла.Каждый символ в расширенном значении параметра проверяется на соответствие шаблону, и, если он соответствует шаблону, его регистр преобразуется.Шаблон не должен пытаться соответствовать более чем одному символу.

Это привело меня к изучению раздела расширение имени файла , который кажется довольно ясным, что должно быть совпадение на первомверхний регистр.

Это заставило меня задуматься о преобразовании регистра, и в общем случае все работает не так, как указывает страница man.

Мой сценарий:

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 Ответ

0 голосов
/ 17 февраля 2019

В руководстве по bash:

Расширения ^^ и ,, преобразуют каждый соответствующий символ в расширенное значение;расширения ^ и , соответствуют и преобразуют только первый символ в расширенное значение.

, преобразует первый символ в нижний регистр, если он соответствуетшаблон.,, преобразует все соответствующие символы.Нет способа конвертировать только первый соответствующий символ.

...