在Bash中将string从大写转换为小写

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

tr命令的问题是,只有当我用echo语句使用该命令时,才能得到结果。 例如:

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

上面的工作和结果在'你好',但我需要将结果分配给一个variables如下:

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

当分配上面的值时,它给了我一个空的结果。

PS:我的Bash版本是3.1.17

如果你使用的是bash 4,你可以使用下面的方法:

 x="HELLO" echo $x # HELLO y=${x,,} echo $y # hello z=${y^^} echo $z # HELLO 

只使用一个,^使第一个字母lowercaseuppercase

实现你的代码的正确方法是

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

这使用$(...)表示法来捕获variables中的命令输出。 还要注意stringvariables周围的引号 – 你需要它们来表示$valworld是分配给string的单个东西。

如果你有bash 4.0或更高版本,更高效和优雅的方法是使用bash内build的string操作:

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

为什么不执行反引号?

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

这将反引号的结果赋给variablesx 。 (即它不是特别的tr但是shell脚本的常见模式/解决scheme)

您可以使用$(..)而不是反引号。 在这里看到更多的信息。

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

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

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

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

答案由liborw提供 。

这对我有效。 谢谢Rody!

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

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

 string="${val}_world" 

如果使用declare(old:typeset)定义variables,则可以在整个variables的使用中声明该值的大小写。

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

"-l"的确是lc。

我想我会跳入,并为所有仍然像谷歌那样在Google的顶端发现这个问题的人提供更直接的答案。

我在Ubuntu 14.04,Bash版本4.3.11。 但是,我仍然没有build立在string操作${y,,}的乐趣

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

 CAPITALIZED=`echo "${y}" | tr '[az]' '[AZ]'`