majuscule premier caractère dans une variable avec bash

Je veux mettre en majuscule juste le premier caractère de ma chaîne avec bash.

foo="bar"; //uppercase first character echo $foo; 

devrait imprimer “Bar”;

 foo="$(tr '[:lower:]' '[:upper:]' <<< ${foo:0:1})${foo:1}" 

One way avec bash (version 4+):

 foo=bar echo "${foo^}" 

estampes:

 Bar 

Un moyen avec sed :

 echo "$(echo "$foo" | sed 's/.*/\u&/')" 

Impressions:

 Bar 
 $ foo="bar"; $ foo=`echo ${foo:0:1} | tr '[az]' '[AZ]'`${foo:1} $ echo $foo Bar 

Voici la méthode “native” des outils de texte:

 #!/bin/bash ssortingng="abcd" first=`echo $ssortingng|cut -c1|tr [az] [AZ]` second=`echo $ssortingng|cut -c2-` echo $first$second 

Cela peut être fait en pure bash avec bash-3.2 aussi:

 # First, get the first character. fl=${foo:0:1} # Safety check: it must be a letter :). if [[ ${fl} == [az] ]]; then # Now, obtain its octal value using printf (builtin). ord=$(printf '%o' "'${fl}") # Fun fact: [az] maps onto 0141..0172. [AZ] is 0101..0132. # We can use decimal '- 40' to get the expected result! ord=$(( ord - 40 )) # Finally, map the new value back to a character. fl=$(printf '%b' '\'${ord}) fi echo "${fl}${foo:1}" 

Utiliser awk uniquement

 foo="uNcapItalizedstrIng" echo $foo | awk '{print toupper(substr($0,0,1))tolower(substr($0,2))}' 

Celui-ci a travaillé pour moi:

Rechercher tous les fichiers * php dans le répertoire en cours et remplacer le premier caractère de chaque nom de fichier par une lettre majuscule:

ex: test.php => Test.php

 for f in *php ; do mv "$f" "$(\sed 's/.*/\u&/' <<< "$f")" ; done 

pour votre situation

 a='one two three' a="${a^}" printf '%s\n' "$a" # One two three 

pour chaque mot en majuscule première lettre

 a='one two three' b=( $a ) # $a without quotes for word in "${b[@]}"; do c+=( "${word^}" ) done a="${c[*]}" printf '%s\n' "$a" # One Two Three 
 first-letter-to-lower () { str="" space=" " for i in $@ do if [ -z $(echo $i | grep "the\|of\|with" ) ] then str=$str"$(echo ${i:0:1} | tr '[AZ]' '[az]')${i:1}$space" else str=$str${i}$space fi done echo $str } first-letter-to-upper-xc () { v-first-letter-to-upper | xclip -selection clipboard } first-letter-to-upper () { str="" space=" " for i in $@ do if [ -z $(echo $i | grep "the\|of\|with" ) ] then str=$str"$(echo ${i:0:1} | tr '[az]' '[AZ]')${i:1}$space" else str=$str${i}$space fi done echo $str } 

first-letter-to-lower-xc () {v-première-lettre-au-bas | Presse-papiers à sélection de xclip}

Que faire si le premier caractère n’est pas une lettre (mais un onglet, un espace et une double citation échappée)? Nous ferions mieux de le tester jusqu’à ce que nous trouvions une lettre! Alors:

 S=' \"ó foo bar\"' N=0 until [[ ${S:$N:1} =~ [[:alpha:]] ]]; do N=$[$N+1]; done #F=`echo ${S:$N:1} | tr [:lower:] [:upper:]` #F=`echo ${S:$N:1} | sed -E -e 's/./\u&/'` #other option F=`echo ${S:$N:1} F=`echo ${F} #pure Bash solution to "upper" echo "$F"${S:(($N+1))} #without garbage echo '='${S:0:(($N))}"$F"${S:(($N+1))}'=' #garbage preserved Foo bar = \"Foo bar=