在shell脚本中大写每个输入字符串

时间:2016-11-18 16:21:48

标签: shell ksh

我接受一些字符串作为我的脚本的用户输入,如 -

read -p "User's full name : " FULLNAME
read -p "User's Manager's name : " MGRNAME
.
.

我希望所有输入字符串都大写,即大写输入字符串中的每个单词。

我写了一个像 -

这样的简单函数
capitalize()
{
        $1=`echo ${$1}|sed -e "s/\b\(.\)/\u\1/g"`
}

并将此函数称为 -

capitalize FULLNAME

它给出了以下错误 -

line 77: ${$1}: bad substitution

也试过间接扩张 -

capitalize()
    {
            $1=`echo ${!1^}`
    }

它会抛出以下错误 -

line 77: FULLNAME=Kamlesh: command not found

请帮助您使用正确的语法或任何其他方法来实现此目的。

示例输出 - 我正在读取FULLNAME变量中的输入。当我调用capitalize()时,它应该更新FULLNAME变量本身的值。

例如,如果用户输入是 - " kamlesh gallani"

如果我现在调用大写FULLNAME,那么FULLNAME应该包含" Kamlesh Gallani"

5 个答案:

答案 0 :(得分:3)

这将大写一切:

printf '%s\n' "$string" | tr '[:lower:]' '[:upper:]'

当您将问题编辑为大写时,只有每个单词的第一个字符,请尝试以下操作:

read -p "User's full name : " FULLNAME
capitalize()
{
        echo $* | sed -e "s/\b\(.\)/\u\1/g"

}
capitalize $FULLNAME

答案 1 :(得分:2)

使用bash的参数展开,假设变量为var

${var^}  ## Only first character
${var^^} ## All characters

示例:

$ foo=bar

$ echo "${foo^}"
Bar

$ echo "${foo^^}"
BAR

答案 2 :(得分:1)

许多bash - 主义和ksh - 主义,这是另一个完全运行的主义 在shell内。

capitalize()
{
    (typeset -u word=${1:?} && echo "$word")
}

子shell保证变量word实际上是本地的。

答案 3 :(得分:1)

以下是在ksh93u +(2012-08-01)中测试的:

capitalize_words() {
    typeset string string_out
    string=$1
    string_out=''
    read -r -A words <<<"$string"
    for word in "${words[@]}"; do
      [[ -n "$string_out" ]] && string_out+=" "
      first_letter=${word:0:1}
      rest=${word:1}
      string_out+="$(printf '%s\n' "$first_letter" | tr '[:lower:]' '[:upper:]')"
      string_out+="$rest"
    done
    echo "$string_out"
}

此后:

$ capitalize_words 'kamlesh gallani'
Kamlesh Gallani

...或者,修改变量:

fullname='kamlesh gallani'
fullname=$(capitalize_words "$fullname")

如果确实想要间接操作,您可以这样做:

capitalize_words_inplace() {
  typeset -n var="$1"
  var=$(capitalize_words "$var")
}

...此后:

$ fullname='kamlesh gallani'
$ capitalize_words_inplace fullname
$ echo "$fullname"
Kamlesh Gallani

答案 4 :(得分:0)

这种方法似乎有点迂回,但它避免了bash主义,ksh主义和杂耍变量:

printf "User's full name: "; FULLNAME=`head -n 1 | capitalize -c`; echo "$FULLNAME"
User's full name: ed ward
Ed Ward

可以在 Ubuntu的 capitilize包中找到xviewg util,但它不是必需的 - 有many ways to capitalize