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