在Bash中将string从大写转换为小写
我一直在寻找一种方法来将string值从大写转换为小写。 所有的search结果都显示了使用tr
命令的方法。
tr
命令的问题是,只有当我用echo语句使用该命令时,才能得到结果。 例如:
y="HELLO" echo $y| tr '[:upper:]' '[:lower:]'
上面的工作和结果在'你好',但我需要将结果分配给一个variables如下:
y="HELLO" val=$y| tr '[:upper:]' '[:lower:]' string=$val world
当分配上面的值时,它给了我一个空的结果。
PS:我的Bash版本是3.1.17
如果你使用的是bash 4,你可以使用下面的方法:
x="HELLO" echo $x # HELLO y=${x,,} echo $y # hello z=${y^^} echo $z # HELLO
只使用一个,
或^
使第一个字母lowercase
或uppercase
。
实现你的代码的正确方法是
y="HELLO" val=$(echo "$y" | tr '[:upper:]' '[:lower:]') string="$val world"
这使用$(...)
表示法来捕获variables中的命令输出。 还要注意string
variables周围的引号 – 你需要它们来表示$val
和world
是分配给string
的单个东西。
如果你有bash
4.0或更高版本,更高效和优雅的方法是使用bash
内build的string操作:
y="HELLO" string="${y,,} world"
为什么不执行反引号?
x=`echo "$y" | tr '[:upper:]' '[:lower:]'`
这将反引号的结果赋给variablesx
。 (即它不是特别的tr
但是shell脚本的常见模式/解决scheme)
您可以使用$(..)
而不是反引号。 在这里看到更多的信息。
请注意, tr
只能处理纯ASCII,因此在面对国际字符时会使任何基于tr
的解决scheme失败。
基于${x,,}
解决scheme的bash 4也是如此。
另一方面, awk
工具甚至可以正确支持UTF-8 /多字节input。
y="HELLO" val=$(echo "$y" | awk '{print tolower($0)}') string="$val world"
答案由liborw提供 。
这对我有效。 谢谢Rody!
y="HELLO" val=$(echo $y | tr '[:upper:]' '[:lower:]') string="$val world"
一个小的修改,如果你在variables旁边使用下划线你需要在{}中封装variables名。
string="${val}_world"
如果使用declare(old:typeset)定义variables,则可以在整个variables的使用中声明该值的大小写。
$ declare -u FOO=AbCxxx $ echo $FOO ABCXXX
"-l"
的确是lc。
我想我会跳入,并为所有仍然像谷歌那样在Google的顶端发现这个问题的人提供更直接的答案。
我在Ubuntu 14.04,Bash版本4.3.11。 但是,我仍然没有build立在string操作${y,,}
的乐趣
这是我在脚本中用来强制大写的东西:
CAPITALIZED=`echo "${y}" | tr '[az]' '[AZ]'`