我接受一些字符串作为我的脚本的用户输入,如 -
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"
答案 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。