如何在Bash中将字符串从大写转换为小写?

时间:2012-07-09 09:19:51

标签: string bash shell uppercase lowercase

我一直在寻找一种方法将字符串值从大写转换为小写。所有搜索结果都显示了使用tr命令的方法。

tr命令的问题在于,只有在我使用echo语句的命令时才能获得结果。例如:

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

以上工作并以'hello'结果,但我需要将结果分配给变量,如下所示:

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

如上所述分配值时,会给我一个空结果。

PS:我的Bash版本是3.1.17

7 个答案:

答案 0 :(得分:122)

如果您使用的是bash 4,则可以使用以下方法:

x="HELLO"
echo $x  # HELLO

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

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

仅使用一个,^制作第一个字母lowercaseuppercase

答案 1 :(得分:54)

实现代码的正确方法是

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

这使用$(...)表示法来捕获变量中命令的输出。另请注意string变量周围的引号 - 您需要它们来表明$valworld是分配给string的单一内容。

如果你有bash 4.0或更高版本,那么效率更高&优雅的方法是使用bash内置字符串操作:

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

答案 2 :(得分:16)

请注意,tr只能处理纯ASCII,因此在面对国际字符时,任何基于tr的解决方案都会失败。

基于bash 4的${x,,}解决方案也是如此。

另一方面,awk工具可以正确支持UTF-8 /多字节输入。

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

liborw提供答案。

答案 3 :(得分:14)

为什么不用反引号执行?

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

这会将反引号中的命令结果赋给变量x。 (即它不是tr特有的,而是shell脚本的常见模式/解决方案)

您可以使用$(..)代替反引号。有关详细信息,请参阅here

答案 4 :(得分:5)

我在Ubuntu 14.04上,使用Bash版本4.3.11。但是,我仍然没有内置字符串操作${y,,}

的乐趣

这是我在脚本中用来强制大写的:

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

答案 5 :(得分:4)

如果使用declare(old:typeset)定义变量,那么您可以在整个变量的使用中说明值的大小写。

setTimeout(one.update.bind(one),1000);

$ declare -u FOO=AbCxxx $ echo $FOO ABCXXX 执行lc。

答案 6 :(得分:2)

这对我有用。谢谢Rody!

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

一个小的修改,如果你在变量旁边使用下划线你需要在{}中封装变量名。

string="${val}_world"