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

How to convert a string from uppercase to lowercase in Bash?

本问题已经有最佳答案,请猛点这里访问。

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

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

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

上面的工作结果是"hello",但我需要将结果赋给一个变量,如下所示:

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

当像上面那样分配值时,它会给我一个空的结果。

PS:我的bash版本是3.1.17


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

1
2
3
4
5
6
7
8
x="HELLO"
echo $x  # HELLO

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

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

仅使用一个,^生成第一个字母lowercaseuppercase


实现代码的正确方法是

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

它使用$(...)表示法捕获变量中命令的输出。还要注意string变量周围的引号--您需要它们来表示$valworld是要分配给string的单个事物。

如果您有bash4.0或更高版本,则使用bash内置字符串操作是一种更高效、更优雅的方法:

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


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

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

另一方面,awk工具也正确地支持甚至是utf-8/多字节输入。

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

回答Liborw的礼貌。


为什么不在后台执行?

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

这会将命令的反勾号结果分配给变量x。(即,它不是针对tr的,而是针对shell脚本编写的通用模式/解决方案)

您可以使用$(..)而不是backticks。有关详细信息,请参阅此处。


我在Ubuntu14.04上,有bash版本4.3.11。然而,我仍然没有乐趣内置的字符串操作${y,,}

这是我在脚本中用于强制大写的内容:

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


如果使用declare(old:typeset)定义变量,则可以在变量使用过程中声明该值的大小写。

1
2
3
$ declare -u FOO=AbCxxx
$ echo $FOO
ABCXXX

"-l"做信用证。


这对我有用。谢谢你,Rody!

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

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

1
string="${val}_world"