如何在 Bash 中将字符串从大写转换为小写? [复制]
Posted
技术标签:
【中文标题】如何在 Bash 中将字符串从大写转换为小写? [复制]【英文标题】:How to convert a string from uppercase to lowercase in Bash? [duplicate] 【发布时间】:2012-07-08 16:22:52 【问题描述】:我一直在寻找一种将字符串值从大写转换为小写的方法。所有搜索结果都显示了使用tr
命令的方法。
tr
命令的问题在于,我只有在使用带有 echo 语句的命令时才能得到结果。例如:
y="HELLO"
echo $y| tr '[:upper:]' '[:lower:]'
上述工作并产生“你好”,但我需要将结果分配给一个变量,如下所示:
y="HELLO"
val=$y| tr '[:upper:]' '[:lower:]'
string=$val world
当像上面那样分配值时,它会给我一个空的结果。
PS:我的 Bash 版本是 3.1.17
【问题讨论】:
对于文件:cat file_name | tr '[:upper:]' '[:lower:]' >> 低 【参考方案1】:如果您使用的是 bash 4,则可以使用以下方法:
x="HELLO"
echo $x # HELLO
y=$x,,
echo $y # hello
z=$y^^
echo $z # HELLO
仅使用一个,
或^
组成第一个字母lowercase
或uppercase
。
【讨论】:
感谢您的即时回复。当我尝试上述方法时,它说 $y,,--bad replacement。我如何尝试另一种方法 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 :(【参考方案2】:
实现代码的正确方法是
y="HELLO"
val=$(echo "$y" | tr '[:upper:]' '[:lower:]')
string="$val world"
这使用$(...)
表示法在变量中捕获命令的输出。还要注意string
变量周围的引号——你需要它们来表示$val
和world
是一个要分配给string
的东西。
如果您有bash
4.0 或更高版本,更高效和优雅的方法是使用bash
内置字符串操作:
y="HELLO"
string="$y,, world"
【讨论】:
echo $y
是错误的——如果你的y
包含,比如* HELLO *
,那些*
s 将被替换为文件名,三个空格的运行将被替换为每个.总是引用扩展:echo "$y" | tr ...
@CharlesDuffy 确实,谢谢。已编辑。【参考方案3】:
请注意,tr
只能处理纯 ASCII,因此任何基于 tr
的解决方案在面对国际字符时都会失败。
基于 bash 4 的 $x,,
解决方案也是如此。
另一方面,awk
工具甚至可以正确支持 UTF-8 / 多字节输入。
y="HELLO"
val=$(echo "$y" | awk 'print tolower($0)')
string="$val world"
回答由liborw提供。
【讨论】:
【参考方案4】:为什么不在反引号中执行?
x=`echo "$y" | tr '[:upper:]' '[:lower:]'`
这会将反引号中的命令结果分配给变量x
。 (即它不是 tr
特有的,而是 shell 脚本的常见模式/解决方案)
您可以使用$(..)
代替反引号。请参阅here 了解更多信息。
【讨论】:
非常感谢您的回答。上面的作品..为了让它更好,我尝试了 y="HI" val = $( tr '[AZ]' '[az]' 需要引号:echo "$y"
,而不是 echo $y
,或者通配符被扩展,空格被单个空格字符替换,等等。
@CharlesDuffy 确实,谢谢。已编辑。
@raga <<<
- 喜欢它!!!比echo
“矫枉过正”更优雅☺︎
请记住,\$
、双反斜杠和反斜杠反引号不会按字面意思用反引号处理,但它们会在 $(..)
内。根据您的用例,这可能是好是坏。 tldp.org/LDP/Bash-Beginners-Guide/html/sect_03_04.html 第 3.4.5 节。【参考方案5】:
我使用的是 Ubuntu 14.04,Bash 版本为 4.3.11。但是,我仍然没有内置字符串操作的乐趣$y,,
这是我在脚本中用来强制大写的:
CAPITALIZED=`echo "$y" | tr '[a-z]' '[A-Z]'`
【讨论】:
脚本顶部的 shebang 行是否指向旧版本的 bash? 不,我的系统上只安装了一个版本,所以它指向系统默认的 bash。 我认为[]
不是必需的:unix.stackexchange.com/questions/51983/…
如果您使用#!/bin/sh
,$y,,
将无法在 Ubuntu 中工作,因为默认 shell 是 Dash。你必须使用#!/bin/bash
【参考方案6】:
如果您使用 declare (old: typeset) 定义变量,那么您可以在整个变量使用过程中说明值的大小写。
$ declare -u FOO=AbCxxx
$ echo $FOO
ABCXXX
"-l"
做 lc。
【讨论】:
不在 Bash 3.2 中【参考方案7】:这对我有用。谢谢罗迪!
y="HELLO"
val=$(echo $y | tr '[:upper:]' '[:lower:]')
string="$val world"
一个小修改,如果你在变量旁边使用下划线你需要将变量名封装在中。
string="$val_world"
【讨论】:
以上是关于如何在 Bash 中将字符串从大写转换为小写? [复制]的主要内容,如果未能解决你的问题,请参考以下文章