Я искал SO и обнаружил, что в верхнем регистре будет работать следующая строка
str="Some string"
echo ${str^^}
Но я попытался сделать то же самое с аргументом командной строки, который дал мне следующую ошибку
Пытался
#!/bin/bash
## Output
echo ${1^^} ## line 3: ${1^^}: bad substitution
echo {$1^^} ## No error, but output was still smaller case i.e. no effect
Как мы могли это сделать?
bash
string
case-sensitivity
холодный морской тропический воздух
источник
источник
bash
?Ответы:
Синтаксис,
str^^
который вы пытаетесь использовать, доступен в Bash 4.0 и выше. Возможно, у вас более старая версия (или вы запустили скриптsh
явно):Попробуй это:
источник
tr '[a-z]' [[A-Z]'
.tr '[a-z]' '[A-Z]'
.GNU bash, version 4.3.42(1)-release (x86_64-apple-darwin14.5.0)
и получаю ту же ошибку, что и OP, поэтому я не думаю, что она доступна на любойbash
версии 4.0 и выше, как вы говорите.Выход:
источник
/
как вtr /a-z/ /A-Z/
до моего редактирования: это просто работает, потому что он заменяет/
,/
но бесполезно: pubs.opengroup.org/onlinepubs/9699919799/utilities/tr.html Также существует более неясный и менее полезныйtr '[:lower:]' '[:upper:]'
.Будьте осторожны с tr, если только AZ не все, что вы используете. Для других локалей даже '[: lower:]' '[: upper:]' не работает, работает только touk и bash (v4 +) в awk
источник
tr '[:lower:]' '[:upper:]'
сейчас работает для вашего примера на OS X, по крайней мере (также сLC_ALL=sv_SE
)В качестве альтернативы вы можете переключиться на ksh или zsh, которые десятилетиями поддерживали преобразование регистра (задолго до того,
bash
как было${var^^}
добавлено в 4.0), хотя и с другим синтаксисом:(также работает с
zsh
; обратите внимание, что в pdksh / mksh, это работает только для букв ASCII).С помощью
zsh
вы также можете использоватьU
флаг расширения параметра:POSIXLY, вы можете использовать:
Есть также:
Но в нескольких реализациях, включая GNU
tr
, это работает только для однобайтовых символов (так в локалях UTF-8, только для букв ASCII).источник
Если кто-то все еще пытается получить ошибку
${str^^}
, вы можете попробоватьpython -c
или,perl
скорее всего, потому что версия bash ниже 4.Но пока что bash 4 или более быстро работает с существующим решением.
Использование
python -c
в BashТочно так же это может также использоваться, чтобы использовать с:
С помощью
perl
источник