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
- See also:stackoverflow.com/questions/2264428/…
如果您使用的是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 |
仅使用一个,或^生成第一个字母lowercase或uppercase。
- 感谢您的及时回复。当我尝试上述方法时,它说,Y,——替换错误。我尝试过其他方法y="hi"val=$(tr'[a-z]'''[a-z]'<<<$y),这对我很有效。再次感谢。
- 你的bash版本太低了。它不支持这些功能。
- 是的…正在尝试在ant build.xml文件中执行相同的逻辑。正在尝试将字符串从大写转换为小写。如何实现这一点。尝试了scriptdef模式和其他模式,但它无法工作。
- bash字符串替换在CentOS 5.9上不起作用
- ,^^替换只在bash 4上工作,而不是bash 3,因此您需要升级bash或使用tr方法。
- 如果返回了错误的替换消息,还应检查是否意外地在变量名($$Y,、而不是$Y,、)之前写入了"$",这会导致与bash版本过低时相同的错误(可以使用"bash--version"检查)。
实现代码的正确方法是
1 2 3
| y="HELLO"
val=$(echo"$y" | tr '[:upper:]' '[:lower:]')
string="$val world" |
它使用$(...)表示法捕获变量中命令的输出。还要注意string变量周围的引号--您需要它们来表示$val和world是要分配给string的单个事物。
如果您有bash4.0或更高版本,则使用bash内置字符串操作是一种更高效、更优雅的方法:
1 2
| y="HELLO"
string="${y,,} world" |
- echo $y是一辆小车——如果你的y包含,比如说* HELLO *,那么这些*将被文件名替换,三个空格的运行将被每个空格替换。总是引用扩展:echo"$y" | tr ...。
- @真的,谢谢。编辑。
请注意,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。有关详细信息,请参阅此处。
- 非常感谢你的回答。上面的工作..为了使它更好,我尝试了y="hi"val=$(tr'[a-z]''[a-z]'<<<$y),它对我很好..再次感谢你的建议
- 需要引号:echo"$y",而不是echo $y,或者通配符被扩展,一段空格被替换为一个空格字符,等等。
- @真的,谢谢。编辑。
- @Raga <<<-爱它!!!!比echo的"过度杀戮"更优雅??
- 请记住,\$、双反斜杠和反斜杠反斜杠将不会用反斜杠字面上的方式处理,但它们将在$(..)内处理。这可能是好的或坏的,取决于你的用例。tldp.org/ldp/bash-初学者指南/html/sect_03_04.html第3.4.5节。
我在Ubuntu14.04上,有bash版本4.3.11。然而,我仍然没有乐趣内置的字符串操作${y,,}
这是我在脚本中用于强制大写的内容:
1
| CAPITALIZED=`echo"${y}" | tr '[a-z]' '[A-Z]'` |
- 脚本顶部的shebang行是否指向了较旧版本的bash?
- 不,我的系统上只安装了一个版本,所以它指向系统默认bash。
- 我认为不需要[]:unix.stackexchange.com/questions/51983/&hellip;
如果使用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" |
一个小的修改,如果在变量旁边使用下划线,则需要用封装变量名。