2016-11-18 69 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'的擴展 - 否則您將擴展球體,將選項卡或空間運行合併到一個空間中,等等。 –