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

String 如何在Bash中将字符串从大写转换为小写?,string,bash,shell,uppercase,lowercase,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 当像上面那样赋值时,它会给我一个

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

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

y="HELLO"
echo $y| tr '[:upper:]' '[:lower:]'
上面的工作方式和结果为“hello”,但我需要将结果分配给一个变量,如下所示:

y="HELLO"
val=$y| tr '[:upper:]' '[:lower:]'
string=$val world
当像上面那样赋值时,它会给我一个空结果


注:我的Bash版本是3.1.17,为什么不在backticks中执行呢

 x=`echo "$y" | tr '[:upper:]' '[:lower:]'` 
这会将反勾号中的命令结果分配给变量
x
。(即,它不是特定于
tr
,而是shell脚本的常见模式/解决方案)


您可以使用
$(..)
而不是反勾号。有关更多信息,请参阅。

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

x="HELLO"
echo $x  # HELLO

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

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

只使用一个
^
将第一个字母
小写
大写

实现代码的正确方法是

y="HELLO"
val=$(echo "$y" | tr '[:upper:]' '[:lower:]')
string="$val world"
这使用
$(…)
符号在变量中捕获命令的输出。还要注意
字符串
变量周围的引号——您需要它们在那里表示
$val
world
是要分配给
字符串
的单个对象

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

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

这对我有用。谢谢你,罗迪

y="HELLO"
val=$(echo $y | tr '[:upper:]' '[:lower:]')
string="$val world"
一个小修改,如果在变量旁边使用下划线,则需要将变量名封装在{}中

string="${val}_world"

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

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

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

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

回答由提供。

我使用的是Ubuntu 14.04,Bash版本为4.3.11。但是,我仍然无法享受内置字符串操作的乐趣
${y,,}

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

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

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

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

“-l”
做信用证。

非常感谢您的回答。上面的方法很有效。为了让它更好,我尝试了y=“HI”val=$(tr'[A-Z]'[A-Z]'需要引号:
echo“$y”
,而不是
echo$y
,或者通配符被扩展,空白的运行被替换为一个空格字符,等等@CharlesDuffy,确实,谢谢。编辑。@raga
请记住
\$
,双反斜杠和反斜杠反斜杠不会被直接用反斜杠来处理,但它们会在
$(..)内
。这可能是好的,也可能是坏的,这取决于您的用例。第3.4.5节。感谢您的即时响应。当我尝试上面的方法时,它说${y,,}--错误的替换。我如何尝试y=“HI”val=$(tr'[A-Z]'[A-Z]的另一种方法'您的bash版本太低。它不支持这些功能。,^^替换仅适用于bash 4,而不适用于bash 3,因此您需要升级bash或使用tr方法。如果返回错误的替换消息,还应检查您是否意外地在变量名(${$y,,}而不是${y,,}之前写入了'。',这会导致与bash版本过低时相同的错误(您可以使用“bash--version”进行检查)。我有一段时间感到困惑,因为我正在执行
bash--version
并获得5.0.3版本,但后来意识到这是bash的brew版本(位于
/usr/local/bin/bash
).我的脚本在标题中有我的系统bash,标题为
#!/bin/bash
,版本3:(
echo$y
有缺陷——如果包含您的
y
,请说
*HELLO*
,这些
*
s将被替换为文件名,三个空格的运行将被替换为每个空格。始终引用扩展名:
echo“$y”| tr…
@CharlesDuffy确实,谢谢。已编辑。脚本顶部的shebang行是否指向较旧版本的bash?不,我的系统上只安装了一个版本,因此它指向系统默认的bash。我认为
[]
不是必需的:
${y,,}如果您使用
#!/bin/sh
在Ubuntu中不起作用,因为默认shell是Dash。您必须在bash 3.2中使用
#!/bin/bash