【问题标题】:First character of a variable in a shell script to uppercase?shell脚本中变量的第一个字符为大写?
【发布时间】:2012-09-07 08:53:45
【问题描述】:

我有一个启动模块单元测试的 shell 脚本。我需要全部小写的模块名称和第一个字符大写。到目前为止,我一直在这样做:

#!/bin/sh -x                                                                                                                                                                          
# z.B. getbrowser                                                                                                                                                                     
strModuleToTest=$1

# g                                                                                                                                                                                   
strModuleToTestUppercaseFirstletter=${strModuleToTest:0:1}
# etbrowser                                                                                                                                                                           
strModuleToTestUppercaseLastletters=${strModuleToTest:1}

# g -> G                                                                                                                                                                              
strModuleToTestUppercaseFirstletter="${strModuleToTestUppercaseFirstletter/a/A}"
strModuleToTestUppercaseFirstletter="${strModuleToTestUppercaseFirstletter/b/B}"
strModuleToTestUppercaseFirstletter="${strModuleToTestUppercaseFirstletter/c/C}"
strModuleToTestUppercaseFirstletter="${strModuleToTestUppercaseFirstletter/d/D}"
strModuleToTestUppercaseFirstletter="${strModuleToTestUppercaseFirstletter/e/E}"
strModuleToTestUppercaseFirstletter="${strModuleToTestUppercaseFirstletter/f/F}"
strModuleToTestUppercaseFirstletter="${strModuleToTestUppercaseFirstletter/g/G}"
strModuleToTestUppercaseFirstletter="${strModuleToTestUppercaseFirstletter/h/H}"
strModuleToTestUppercaseFirstletter="${strModuleToTestUppercaseFirstletter/i/I}"
strModuleToTestUppercaseFirstletter="${strModuleToTestUppercaseFirstletter/j/J}"
strModuleToTestUppercaseFirstletter="${strModuleToTestUppercaseFirstletter/k/K}"
strModuleToTestUppercaseFirstletter="${strModuleToTestUppercaseFirstletter/l/L}"
strModuleToTestUppercaseFirstletter="${strModuleToTestUppercaseFirstletter/m/M}"
strModuleToTestUppercaseFirstletter="${strModuleToTestUppercaseFirstletter/n/N}"
strModuleToTestUppercaseFirstletter="${strModuleToTestUppercaseFirstletter/o/O}"
strModuleToTestUppercaseFirstletter="${strModuleToTestUppercaseFirstletter/p/P}"
strModuleToTestUppercaseFirstletter="${strModuleToTestUppercaseFirstletter/q/Q}"
strModuleToTestUppercaseFirstletter="${strModuleToTestUppercaseFirstletter/r/R}"
strModuleToTestUppercaseFirstletter="${strModuleToTestUppercaseFirstletter/s/S}"
strModuleToTestUppercaseFirstletter="${strModuleToTestUppercaseFirstletter/t/T}"
strModuleToTestUppercaseFirstletter="${strModuleToTestUppercaseFirstletter/u/U}"
strModuleToTestUppercaseFirstletter="${strModuleToTestUppercaseFirstletter/v/V}"
strModuleToTestUppercaseFirstletter="${strModuleToTestUppercaseFirstletter/w/W}"
strModuleToTestUppercaseFirstletter="${strModuleToTestUppercaseFirstletter/x/X}"
strModuleToTestUppercaseFirstletter="${strModuleToTestUppercaseFirstletter/y/Y}"
strModuleToTestUppercaseFirstletter="${strModuleToTestUppercaseFirstletter/z/Z}"

# Getbrowser
strModuleToTestUppercase=$strModuleToTestUppercaseFirstletter""$strModuleToTestUppercaseLastletters

设置 $strModuleToTestUppercase 的更简单方法是什么?我试过了

strModuleToTestUppercase="${strModuleToTest[@]^}"

strModuleToTestUppercasesed="sed 's/\<./\u&/g' $strModuleToTest"

但没有成功。

【问题讨论】:

    标签: shell unix sed awk


    【解决方案1】:

    如果:

    s=somemodule
    

    使用 bash v4+

    echo ${s^}
    

    这应该适用于稍旧的 bash 版本(来自 Glenn):

    echo $(tr a-z A-Z <<< ${s:0:1})${s:1}")
    

    使用 zsh

    echo ${(C)s}
    

    使用 ash 和 coreutils

    echo $(echo $s | cut -c1 | tr a-z A-Z)$(echo $s | cut -c2-)
    

    使用 GNU sed

    echo $s | sed 's/./\U&/'
    

    使用 BSD sed

    echo $s | sed '
      h;
      y/quvwxzdermatoglyphicsbfjkn/QUVWXZDERMATOGLYPHICSBFJKN/;
      G;
      s/\(.\)[^\n]*\n.\(.*\)/\1\2/;
    '
    

    使用 awk

    echo $s | awk '{ print toupper(substr($0, 1, 1)) substr($0, 2) }'
    

    使用 perl

    echo $s | perl -nE 'say ucfirst'
    

    使用 python

    echo $s | python -c 'import sys; print sys.stdin.readline().rstrip().capitalize()'
    

    用红宝石

    echo $s | ruby -e 'puts ARGF.read.capitalize'
    

    所有情况下的输出

    Somemodule
    

    【讨论】:

    • +1 最佳答案。另一种选择:"$(tr a-z A-Z &lt;&lt;&lt; ${s:0:1})${s:1}"
    • zsh 一如既往的神秘简单
    • awk - 和 bash 与 ${s:0:1}${s:1}: `substr(s,i,n) substr(s,i)` 其中 s=string, i=start, n=length。在python 中,rstrip() 删除了空格。
    • tr a-z A-Z 不适用于 æ ø å 字母。
    • @AkselA:您可以通过将特定字母添加到列表中来解决此问题,例如:tr 'a-zæøå' 'A-ZÆØÅ'
    【解决方案2】:

    你可以使用

    strModuleToTestUpper=`sed 's/\(.\)/\U\1/' <<< "$strModuleToTest"`
    

    解释

    • \(.\) 匹配单个字符
    • \U\1 将该字符替换为大写版本
    • no /g 表示只处理第一个匹配项。

    【讨论】:

      【解决方案3】:

      perl 可以吗?

      $ x=foobar
      $ x=$(echo "$x" | perl -pe 's/^(.)/uc($1)/e')
      $ echo $x
      Foobar
      

      【讨论】:

      • perl -ne 'print ucfirst' 会更简单。
      • @chepner: 或者少 3 个字符 perl -pe '$_=ucfirst'
      猜你喜欢
      • 2018-12-19
      • 1970-01-01
      • 2019-08-19
      • 2013-07-20
      • 2012-08-30
      • 1970-01-01
      • 2021-01-11
      • 2021-05-12
      相关资源
      最近更新 更多