2016-11-18 8 views
0

Я принимаю несколько строк в качестве пользовательского ввода в мой сценарий, как -заглавной каждый входной строки в сценарии оболочки

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"

+1

Вы помечено как Ksh и Баш. Который из? Существуют синтаксические расширения в bash 4.x, которые здесь важны, что ksh не имеет. ** Пожалуйста, отметьте тег только для оболочки, которую вы на самом деле используете. ** –

+0

BTW, как и для '$ {$ 1}', если вы хотите, чтобы это работало, вы должны искать [косвенное расширение] (http: // mywiki .wooledge.org/BashFAQ/006 # Evaluating_indirect.2Freference_variables). –

+3

(... в другом примечании имена переменных all-caps используются переменными со значением для системы и оболочки, тогда как пространство имен переменных с хотя бы одним строчным символом зарезервировано для использования приложения. Таким образом, ваши сценарии должны использовать чтобы избежать перезаписи чего-либо со значением в операционную систему по ошибке. Это определяется правилами POSIX для переменных среды, но установка переменной оболочки, которая перекрывает имя переменной среды, перезапишет последнее, поэтому правило применяется как в места). –

ответ

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 «s, предполагая, переменная var :

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

Пример:

$ foo=bar 

$ echo "${foo^}" 
Bar 

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

... интересный, это ksh-ism? Я думал, что это была современная игра. Невозможно воспроизвести его на моей копии ksh93. –

+0

Чарльз, не будет работать в 'ksh', я боюсь..андер отредактировал, чтобы уточнить, что – heemayl

+0

... ahh - Я не видел, чтобы OP был помечен для обеих оболочек и сначала увидел тег 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'sxviewg упаковка, но это несущественно - есть many ways to capitalize.

+0

OP хочет загладить только первую букву каждого слова, а не целые строки. Кроме того, 'echo -n' плохо определяется POSIX - рассмотрите вместо этого использование' printf' - и имена всех верхних регистров находятся в пространстве, используемом именами переменных среды со значением для оболочки или системы, поэтому (поскольку определение переменная оболочки с именем, которое перекрывает переменную среды, перезаписывает последнюю), существует меньше риска конфликта с чем-то важным, если вы используете имена нижнего регистра для собственных переменных. См. Http://pubs.opengroup.org/onlinepubs/009695399/basedefs/xbd_chap08.html, четвертый абзац. –

+0

... re: 'echo -n', см. Http://pubs.opengroup.org/onlinepubs/009695399/utilities/echo.html, указав, что вывод' echo', когда '-n' передан, является полной реализацией -определенной. –

+0

... также, 'echo $ FULLNAME' vs' echo "$ FULLNAME" означает, что вы расширяете globs и заменяете символы, найденные в 'IFS' пробелами. –

0

Многие bash -измерения и ksh -измещения, вот еще один, который полностью работает внутри оболочки.

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

подоболочка обеспечивает переменную word действительно местный.

+0

Как минимум, я предлагаю процитировать расширение '$ word' - в противном случае вы расширяете глобусы, объединяете вкладки или пробеги пробелов в одно пространство и т. Д. –

 Смежные вопросы

  • Нет связанных вопросов^_^