Подтвердить что ты не робот

Преобразование строки из верхнего регистра в нижний регистр в Bash

Я искал способ преобразования строкового значения из верхнего регистра в нижний регистр. Все результаты поиска показывают подходы к использованию команды tr.

Проблема с командой tr заключается в том, что я могу получить результат только тогда, когда я использую команду с выражением echo. Например:

y="HELLO"
echo $y| tr '[:upper:]' '[:lower:]'

Вышеупомянутые работы и результаты в "привет", но мне нужно присвоить результат переменной, как показано ниже:

y="HELLO"
val=$y| tr '[:upper:]' '[:lower:]'
string=$val world

При назначении значения, как указано выше, он дает мне пустой результат.

PS: Моя версия Bash - 3.1.17

4b9b3361

Ответ 1

Если вы используете bash 4, вы можете использовать следующий подход:

x="HELLO"
echo $x  # HELLO

y=${x,,}
echo $y  # hello

z=${y^^}
echo $z  # HELLO

Используйте только один , или ^, чтобы сделать первую букву lowercase или uppercase.

Ответ 2

Правильный способ реализации кода -

y="HELLO"
val=$(echo "$y" | tr '[:upper:]' '[:lower:]')
string="$val world"

Используется обозначение $(...) для захвата вывода команды в переменной. Обратите внимание также на кавычки вокруг переменной string - они вам нужны, чтобы указать, что $val и world - это одна вещь, которую нужно назначить string.

Если у вас bash 4.0 или выше, более эффективный и элегантный способ сделать это - использовать bash встроенную строчную манипуляцию:

y="HELLO"
string="${y,,} world"

Ответ 3

Почему бы не выполнить в backticks?

 x=`echo "$y" | tr '[:upper:]' '[:lower:]'` 

Это присваивает результат команды в backticks переменной x. (то есть это не относится к tr, а является общим шаблоном/решением для сценариев оболочки)

Вместо backticks вы можете использовать $(..). См. здесь для получения дополнительной информации.

Ответ 4

Обратите внимание, что tr может обрабатывать только обычный ASCII, что делает любое решение на основе tr неудачным при обращении к международным символам.

То же самое относится к решению ${x,,} на основе bash 4.

Инструмент awk, с другой стороны, правильно поддерживает даже вход UTF-8/multibyte.

y="HELLO"
val=$(echo "$y" | awk '{print tolower($0)}')
string="$val world"

Ответ любезно liborw.

Ответ 5

Это сработало для меня. Спасибо Роди!

y="HELLO"
val=$(echo $y | tr '[:upper:]' '[:lower:]')
string="$val world"

одна небольшая модификация, если вы используете символ подчеркивания рядом с переменной. Вам нужно инкапсулировать имя переменной в {}.

string="${val}_world"

Ответ 6

Если вы определяете свою переменную с помощью declare (old: typeset), тогда вы можете указать случай значения во всей переменной.

$ declare -u FOO=AbCxxx
$ echo $FOO
ABCXXX

"-l" делает lc.

Ответ 7

Я думал, что перейду и добавлю более прямой ответ для тех, кто все еще находит это на вершине Google, как я.

Я на Ubuntu 14.04, с Bash версией 4.3.11. Тем не менее, у меня все еще нет веселья, встроенного в строковое манипулирование ${y,,}

Это то, что я использовал в моей script для принудительной капитализации:

CAPITALIZED=`echo "${y}" | tr '[a-z]' '[A-Z]'`