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

rag*_*aga 78 string bash shell lowercase uppercase

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

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

y="HELLO"
echo $y| tr '[:upper:]' '[:lower:]'
Run Code Online (Sandbox Code Playgroud)

上面的工作和结果是"你好",但我需要将结果分配给变量,如下所示:

y="HELLO"
val=$y| tr '[:upper:]' '[:lower:]'
string=$val world
Run Code Online (Sandbox Code Playgroud)

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

PS:我的Bash版本是3.1.17

kev*_*kev 133

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

x="HELLO"
echo $x  # HELLO

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

z=${y^^}
echo $z  # HELLO
Run Code Online (Sandbox Code Playgroud)

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

  • ,^^替换仅适用于bash 4,而不是bash 3,因此您需要升级bash或使用tr方法. (6认同)
  • 你的bash版本太低了.它不支持这些功能. (5认同)
  • 我有一段时间很困惑,因为我正在执行“bash --version”并获得 5.0.3,但后来意识到这是 bash 的 brew 版本(位于“/usr/local/bin/bash”)。我的脚本在标头中包含了我的系统 bash 和 `#!/bin/bash`,这是版本 3 :( (5认同)
  • 感谢您的即时回复。当我尝试上述操作时,它说 ${y,,}--bad 替换。任何我如何尝试 y="HI" val = $( tr '[AZ]' '[az]' <<< $y) 的另一种方法,这对我有用。再次感谢 (2认同)
  • 如果返回错误的替换消息,还要检查您是否不小心在变量名前写入了“$”(${$y,,} 而不是 ${y,,}),这会导致与 bash 版本太低时相同的错误(您可以使用“bash --version”检查)。 (2认同)

Rod*_*uis 57

实现代码的正确方法是

y="HELLO"
val=$(echo "$y" | tr '[:upper:]' '[:lower:]')
string="$val world"
Run Code Online (Sandbox Code Playgroud)

这使用$(...)符号来捕获变量中命令的输出.还要注意string变量周围的引号- 你需要它们来指示它$val并且world是一个要分配的东西string.

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

y="HELLO"
string="${y,,} world"
Run Code Online (Sandbox Code Playgroud)

  • `echo $ y`是错误的 - 如果你的`y`包含,比如`*HELLO*`,那些`*`将被文件名替换,并且三个空格的运行将被替换为每个.总是引用扩展:`echo"$ y"| tr ...` (4认同)

Dev*_*lar 17

请注意,tr只能处理纯ASCII,使任何tr基于国际字符的解决方案失败.

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

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

y="HELLO"
val=$(echo "$y" | awk '{print tolower($0)}')
string="$val world"
Run Code Online (Sandbox Code Playgroud)

回答由liborw提供.


Bri*_*new 14

为什么不用反引号执行?

 x=`echo "$y" | tr '[:upper:]' '[:lower:]'` 
Run Code Online (Sandbox Code Playgroud)

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

您可以使用$(..)而不是反引号.有关详细信息,请参见此处

  • 非常感谢您的回答.上面的工作..使它更好我试过y ="HI"val = $(tr'[AZ]''[az]'<<< $ y)它对我来说很好..再次感谢你你的建议 (4认同)

Boo*_*dow 6

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

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

CAPITALIZED=`echo "${y}" | tr '[a-z]' '[A-Z]'`
Run Code Online (Sandbox Code Playgroud)


小智 5

根据罗迪的回答,这对我有用。

y="HELLO"
val=$(echo $y | tr '[:upper:]' '[:lower:]')
string="$val world"
Run Code Online (Sandbox Code Playgroud)

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

string="${val}_world"
Run Code Online (Sandbox Code Playgroud)


Ste*_*ell 5

如果使用声明(旧:类型集)定义变量,则可以在变量的整个使用过程中陈述该值的大小写。

$ declare -u FOO=AbCxxx
$ echo $FOO
ABCXXX
Run Code Online (Sandbox Code Playgroud)

"-l" lc。

  • Bash 3.2 中没有 (2认同)
  • Bash 3.2 [发布](https://en.wikipedia.org/wiki/Bash_%28Unix_shell%29#Release_history) 于 2006 年 10 月 11 日(大约 16 年前)。那是在 [Shellshock](https://en.wikipedia.org/wiki/Shellshock_%28software_bug%29) 被(正式)发现之前(2014 年)。 (2认同)