【问题标题】:How to convert a string from uppercase to lowercase in Bash? [duplicate]如何在 Bash 中将字符串从大写转换为小写? [复制]
【发布时间】: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:]' >> 低

标签: string bash shell uppercase lowercase


【解决方案1】:

如果您使用的是 bash 4,则可以使用以下方法:

x="HELLO"
echo $x  # HELLO

y=${x,,}
echo $y  # hello

z=${y^^}
echo $z  # HELLO

仅使用一个,^ 组成第一个字母lowercaseuppercase

【讨论】:

  • 感谢您的即时回复。当我尝试上述方法时,它说 ${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 变量周围的引号——你需要它们来表示$valworld 是一个要分配给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"
    

    【讨论】:

      猜你喜欢
      • 2022-01-19
      • 2011-01-16
      • 2021-06-11
      • 2014-06-05
      • 1970-01-01
      • 2010-11-04
      • 2010-12-29
      • 1970-01-01
      • 2014-10-30
      相关资源
      最近更新 更多