2016-11-18 75 views
0

每个输入字符串我接受弦数作为用户输入到我的剧本一样 -大写在shell脚本

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变量本身的值。

对于例如,如果用户输入是 - “卡姆利什gallani”

如果我请现在利用FULLNAME,然后FULLNAME应包含“卡姆利什Gallani”

+1

标记了你都KSH和bash。哪一个?在bash 4.x中有相关的语法扩展,ksh没有。 **请仅为您实际使用的shell标记** –

+0

顺便说一句,对于'$ {$ 1}',如果您希望这样做,那么您应该查找[间接扩展](http:// mywiki .wooledge.org/BashFAQ/006#Evaluating_indirect.2Freference_variables)。 –

+3

(...在不同的说明中,全变量变量名用于系统和shell的含义变量,而具有至少一个小写字符的变量的名称空间保留给应用程序使用。因此,脚本应该使用小写变量以避免错误地覆盖操作系统的含义,这是由POSIX规则规定的环境变量规定的,但是设置与环境变量名称重叠的shell变量将覆盖后者,所以该规则适用于地方)。 –

回答

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 
1

使用bash的参数扩展,假设可变var

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

实施例:

$ foo=bar 

$ echo "${foo^}" 
Bar 

$ echo "${foo^^}" 
BAR 
+1

...有趣的是,这是一个ksh-ism?我认为这是一个现代bash功能。无法在我自己的ksh93副本上重现它。 –

+0

查尔斯,不会在'ksh'中工作,我害怕......编辑澄清 – heemayl

+0

...... ahh - 我没有看到OP被标记为两个shell,并首先看到ksh标记。 *叽*。 –

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 
+0

这会将每个字母转换为大写,我只需要每个字的首字母都是大写。 –

+0

请检查我编辑的答案 –

0

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

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

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

+0

OP只想大写每个单词的首字母,而不是整个字符串。另外,'echo -n'由POSIX定义的不好 - 考虑使用'printf'来代替 - 而且所有大写变量名称都在由环境变量名称使用的空间中,这对于shell或系统是有意义的,所以一个名称与环境变量重叠的shell变量会覆盖后者)如果您为自己的变量使用小写名称,那么与重要事件冲突的风险就会降低。请参阅http://pubs.opengroup.org/onlinepubs/009695399/basedefs/xbd_chap08.html第四段。 –

+0

... re:'echo -n',参见http://pubs.opengroup.org/onlinepubs/009695399/utilities/echo.html,当'-n'传递时指定'echo'的输出是完全实现的-defined。 –

+0

...此外,'echo $ FULLNAME' vs'echo“$ FULLNAME”'表示您正在扩展globs并用'空格替换'IFS'中的字符。 –

0

许多bash -isms和ksh -isms,这里是另一个在shell中完全运行 。

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

subshel​​l保证变量word确实是本地的。

+0

至少,我会建议引用'$ word'的扩展 - 否则您将扩展球体,将选项卡或空间运行合并到一个空间中,等等。 –