115

我一直在寻找一种将字符串值从大写转换为小写的方法。所有的搜索结果都显示了使用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

4

7 回答 7

198

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

x="HELLO"
echo $x  # HELLO

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

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

仅使用一个,or^来制作第一个字母lowercaseor uppercase

于 2012-07-09T09:24:22.687 回答
76

实现代码的正确方法是

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

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

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

y="HELLO"
string="${y,,} world"
于 2012-07-09T09:38:42.100 回答
28

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

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

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

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

回答由liborw提供。

于 2014-12-15T09:17:46.547 回答
18

为什么不执行反引号?

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

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

您可以使用$(..)而不是反引号。请参阅此处了解更多信息。

于 2012-07-09T09:22:54.340 回答
8

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

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

CAPITALIZED=`echo "${y}" | tr '[a-z]' '[A-Z]'`
于 2016-02-18T16:32:39.637 回答
5

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

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

"-l"lc。

于 2017-11-06T17:29:28.637 回答
4

这对我有用。谢谢罗迪!

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

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

string="${val}_world"
于 2014-09-26T18:16:34.097 回答