带有bash的变量中的大写第一个字符

cho*_*ovy 145 bash

我想用bash将字符串中的第一个字符大写.

foo="bar";

//uppercase first character

echo $foo;
Run Code Online (Sandbox Code Playgroud)

应打印"Bar";

Ste*_*eve 279

使用bash(版本4+)的一种方法:

foo=bar
echo "${foo^}"
Run Code Online (Sandbox Code Playgroud)

打印:

Bar
Run Code Online (Sandbox Code Playgroud)

  • @CMCDragonkai:要小写第一个字母,请使用"$ {foo,}"`.要小写所有字母,请使用"$ {foo ,,}"`.要将所有字母大写,请使用"$ {foo ^^}"`. (34认同)
  • 这似乎不适用于Mac。出现以下错误:`不良替代` (4认同)
  • 与此相反吗? (2认同)
  • @TolandHon:您可能已经解决了,您需要升级到 4.x 版,或者如果由于某种原因无法升级该机器,请尝试其他解决方案。 (2认同)

Mic*_*man 128

foo="$(tr '[:lower:]' '[:upper:]' <<< ${foo:0:1})${foo:1}"
Run Code Online (Sandbox Code Playgroud)

  • @KrzysztofJabłoński:实际上,下面的"最佳得分答案"将产生与Bash 4下的答案相同的结果.这个答案有调用子shell(另一个shell)的开销,调用'tr'实用程序的开销(另一个进程) ,而不是Bash),使用here-doc/string(临时文件创建)的开销,并且它使用两个替换,与最佳得分答案的一个相比.如果您绝对必须编写遗留代码,请考虑使用函数而不是子shell. (10认同)
  • @ItaiHanski OP没有说明剩下的字符会发生什么,只有第一个字符.假设他们想将`notQuiteCamel`改为`NotQuiteCamel`.您的变体具有副作用或强制其余为小写 - 代价是子shell和tr进程的数量加倍. (4认同)
  • 这个答案假设输入都是小写的。这个变体没有任何假设: $(tr '[:lower:]' '[:upper:]' &lt;&lt;&lt; ${foo:0:1})$(tr '[:upper:]' '[:lower: ]' &lt;&lt;&lt; ${foo:1}) (3认同)
  • @DanieleOrlando,是的,但这个问题除了`bash`之外没有任何标签. (3认同)
  • 尽管比最佳得分答案更复杂,但这个答案实际上确实如此:'变量中的大写第一个字符'.得分最高的答案没有那个结果.看起来简单的答案比正确的答案更受欢迎? (2认同)

Ste*_*eve 27

一种方式sed:

echo "$(echo "$foo" | sed 's/.*/\u&/')"
Run Code Online (Sandbox Code Playgroud)

打印:

Bar
Run Code Online (Sandbox Code Playgroud)

  • 不适用于MacOS10 Lion sed,叹气,\ u扩展到u而不是运营商. (9认同)
  • 只需将其更改为`sed's /./\U&/`它就可以在POSIX sed上运行. (4认同)
  • @DavidConrad`回声“酒吧” | sed 's/./\U&amp;/'` 在 mac 上生成 `Ubar`。我认为 `\U` 不是 POSIX 标准,而是 GNU 扩展。 (3认同)
  • @vwvan`brew install coreutils gnu-sed`并按照说明使用不带前缀`g`的命令。自从获得GNU版本以来,我从未想过要运行这些命令的OSX版本。 (2认同)
  • @Dean:FWIW,我从来没想过运行OSX :-) (2认同)

Maj*_*ssi 21

$ foo="bar";
$ foo=`echo ${foo:0:1} | tr  '[a-z]' '[A-Z]'`${foo:1}
$ echo $foo
Bar
Run Code Online (Sandbox Code Playgroud)


Fre*_*man 14

只是为了好玩,你在这里:

foo="bar";    

echo $foo | awk '{$1=toupper(substr($1,0,1))substr($1,2)}1'
# or
echo ${foo^}
# or
echo $foo | head -c 1 | tr [a-z] [A-Z]; echo $foo | tail -c +2
# or
echo ${foo:1} | sed -e 's/^./\B&/'
Run Code Online (Sandbox Code Playgroud)

  • (具体来说,“awk”解决方案适用于任何兼容 POSIX 的 awk。) (2认同)
  • 这适用于 MacOS 和 ZSH。 (2认同)

小智 13

这是"原生"文本工具的方式:

#!/bin/bash

string="abcd"
first=`echo $string|cut -c1|tr [a-z] [A-Z]`
second=`echo $string|cut -c2-`
echo $first$second
Run Code Online (Sandbox Code Playgroud)

  • @DanieleOrlando,不像人们希望的那样便携.`tr [:lower:] [:upper:]`是一个更好的选择,如果它需要在包含不在`az`或`AZ`范围内的字母的语言/语言环境中工作. (3认同)

And*_*rey 13

仅将第一个单词大写:

foo='one two three'
foo="${foo^}"
echo $foo
Run Code Online (Sandbox Code Playgroud)

二三


将变量中的每个单词大写:

foo="one two three"
foo=( $foo ) # without quotes
foo="${foo[@]^}"
echo $foo
Run Code Online (Sandbox Code Playgroud)

Ø NE牛逼WO牛逼重稀土


(适用于 bash 4+)


tos*_*ske 7

仅使用awk

foo="uNcapItalizedstrIng"
echo $foo | awk '{print toupper(substr($0,0,1))tolower(substr($0,2))}'
Run Code Online (Sandbox Code Playgroud)


小智 7

这也有效...

FooBar=baz

echo ${FooBar^^${FooBar:0:1}}

=> Baz
Run Code Online (Sandbox Code Playgroud)
FooBar=baz

echo ${FooBar^^${FooBar:1:1}}

=> bAz
Run Code Online (Sandbox Code Playgroud)
FooBar=baz

echo ${FooBar^^${FooBar:2:2}}

=> baZ
Run Code Online (Sandbox Code Playgroud)

等等。

资料来源:

介绍/教程:


Mic*_*rny 5

它也可以使用 bash-3.2 在纯 bash 中完成:

# First, get the first character.
fl=${foo:0:1}

# Safety check: it must be a letter :).
if [[ ${fl} == [a-z] ]]; then
    # Now, obtain its octal value using printf (builtin).
    ord=$(printf '%o' "'${fl}")

    # Fun fact: [a-z] maps onto 0141..0172. [A-Z] is 0101..0132.
    # We can use decimal '- 40' to get the expected result!
    ord=$(( ord - 40 ))

    # Finally, map the new value back to a character.
    fl=$(printf '%b' '\'${ord})
fi

echo "${fl}${foo:1}"
Run Code Online (Sandbox Code Playgroud)