我一直在寻找一种方法将字符串值从大写转换为小写。所有搜索结果都显示了使用tr
命令的方法。
tr
命令的问题在于,只有在我使用echo语句的命令时才能获得结果。例如:
y="HELLO"
echo $y| tr '[:upper:]' '[:lower:]'
以上工作并以'hello'结果,但我需要将结果分配给变量,如下所示:
y="HELLO"
val=$y| tr '[:upper:]' '[:lower:]'
string=$val world
如上所述分配值时,会给我一个空结果。
PS:我的Bash版本是3.1.17
答案 0 :(得分:122)
如果您使用的是bash 4,则可以使用以下方法:
x="HELLO"
echo $x # HELLO
y=${x,,}
echo $y # hello
z=${y^^}
echo $z # HELLO
仅使用一个,
或^
制作第一个字母lowercase
或uppercase
。
答案 1 :(得分:54)
实现代码的正确方法是
y="HELLO"
val=$(echo "$y" | tr '[:upper:]' '[:lower:]')
string="$val world"
这使用$(...)
表示法来捕获变量中命令的输出。另请注意string
变量周围的引号 - 您需要它们来表明$val
和world
是分配给string
的单一内容。
如果你有bash
4.0或更高版本,那么效率更高&优雅的方法是使用bash
内置字符串操作:
y="HELLO"
string="${y,,} world"
答案 2 :(得分:16)
请注意,tr
只能处理纯ASCII,因此在面对国际字符时,任何基于tr
的解决方案都会失败。
基于bash 4的${x,,}
解决方案也是如此。
另一方面,awk
工具可以正确支持UTF-8 /多字节输入。
y="HELLO"
val=$(echo "$y" | awk '{print tolower($0)}')
string="$val world"
由liborw提供答案。
答案 3 :(得分:14)
为什么不用反引号执行?
x=`echo "$y" | tr '[:upper:]' '[:lower:]'`
这会将反引号中的命令结果赋给变量x
。 (即它不是tr
特有的,而是shell脚本的常见模式/解决方案)
您可以使用$(..)
代替反引号。有关详细信息,请参阅here。
答案 4 :(得分:5)
我在Ubuntu 14.04上,使用Bash版本4.3.11。但是,我仍然没有内置字符串操作${y,,}
这是我在脚本中用来强制大写的:
CAPITALIZED=`echo "${y}" | tr '[a-z]' '[A-Z]'`
答案 5 :(得分:4)
如果使用declare(old:typeset)定义变量,那么您可以在整个变量的使用中说明值的大小写。
setTimeout(one.update.bind(one),1000);
$ declare -u FOO=AbCxxx
$ echo $FOO
ABCXXX
执行lc。
答案 6 :(得分:2)
这对我有用。谢谢Rody!
y="HELLO"
val=$(echo $y | tr '[:upper:]' '[:lower:]')
string="$val world"
一个小的修改,如果你在变量旁边使用下划线你需要在{}中封装变量名。
string="${val}_world"