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

uppercase first character in a variable with bash

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

1
2
3
4
5
foo="bar";

//uppercase first character

echo $foo;

应打印"条形图";


使用bash的单向(版本4+):

1
2
foo=bar
echo"${foo^}"

印刷品:

1
Bar


1
foo="$(tr '[:lower:]' '[:upper:]' <<< ${foo:0:1})${foo:1}"


单路sed

1
echo"$(echo"$foo" | sed 's/.*/\u&/')"

印刷品:

1
Bar


1
2
3
4
$ foo="bar";
$ foo=`echo ${foo:0:1} | tr  '[a-z]' '[A-Z]'`${foo:1}
$ echo $foo
Bar

以下是"本机"文本工具的方法:

1
2
3
4
5
6
#!/bin/bash

string="abcd"
first=`echo $string|cut -c1|tr [a-z] [A-Z]`
second=`echo $string|cut -c2-`
echo $first$second


仅使用AWK

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


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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# 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}"


这也行…

1
2
3
4
5
FooBar=baz

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

=> Baz
1
2
3
4
5
FooBar=baz

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

=> bAz
1
2
3
4
5
FooBar=baz

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

=> baZ

等等。

资料来源:

  • bash手册:shell参数扩展
  • 完整bash指南:参数
  • bash hacker的wiki参数扩展

简介/教程:

  • 电子商务:8.转换为大小写,反之亦然
  • opensource.com:bash中参数扩展的介绍

第一个字符为大写,所有其他小写字母:

1
2
declare -c foo="bar"
echo"$foo"

1
2
declare -c foo="bar"
echo"$foo"

输出:

1
Bar

为了你的情况

1
2
3
4
5
a='one two three'
a="${a^}"
printf '%s
'
"$a"
# One two three

对于每个单词,首字母大写

1
2
3
4
5
6
7
8
9
a='one two three'
b=( $a ) # $a without quotes
for word in"${b[@]}"; do
    c+=("${word^}" )
done
a="${c[*]}"
printf '%s
'
"$a"
# One Two Three


这个对我有用:

在当前目录中搜索所有*php文件,并将每个文件名的第一个字符替换为大写字母:

例如:test.php=>test.php

1
for f in *php ; do mv"$f""$(\sed 's/.*/\u&/' <<<"$f")" ; done


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
first-letter-to-lower () {
        str=""
        space=""
        for i in $@
        do
                if [ -z $(echo $i | grep"the\|of\|with" ) ]
                then
                        str=$str"$(echo ${i:0:1} | tr  '[A-Z]' '[a-z]')${i:1}$space"
                else
                        str=$str${i}$space
                fi
        done
        echo $str
}
first-letter-to-upper-xc () {
        v-first-letter-to-upper | xclip -selection clipboard
}
first-letter-to-upper () {
        str=""
        space=""
        for i in $@
        do
                if [ -z $(echo $i | grep"the\|of\|with" ) ]
                then
                        str=$str"$(echo ${i:0:1} | tr  '[a-z]' '[A-Z]')${i:1}$space"
                else
                        str=$str${i}$space
                fi
        done
        echo $str
}

第一个字母到下-xc()。{v-first-letter-to-lower xclip-选择剪贴板}


如果第一个字符不是字母(而是制表符、空格和转义双引号),该怎么办?我们最好先测试一下,直到找到一封信!所以:

1
2
3
4
5
6
7
8
9
10
11
12
S='  "ó foo bar"'
N=0
until [[ ${S:$N:1} =~ [[:alpha:]] ]]; do N=$[$N+1]; done
#F=`echo ${S:$N:1} | tr [:lower:] [:upper:]`
#F=`echo ${S:$N:1} | sed -E -e 's/./\u&/'` #other option
F=`echo ${S:$N:1}
F=`echo ${F} #pure Bash solution to"upper"
echo"$F"${S:(($N+1))} #without garbage
echo '='${S:0:(($N))}"$F"${S:(($N+1))}'=' #garbage preserved

Foo bar
= "Foo bar=