Comment convertir une chaîne de majuscule en minuscule dans Bash?

J’ai cherché à trouver un moyen de convertir une valeur de chaîne en majuscule en minuscule. Tous les résultats de recherche montrent des approches d’utilisation de la commande tr .

Le problème avec la commande tr est que je ne peux obtenir le résultat que lorsque j’utilise la commande avec echo. Par exemple:

 y="HELLO" echo $y| tr '[:upper:]' '[:lower:]' 

Le travail ci-dessus fonctionne et donne «bonjour», mais je dois atsortingbuer le résultat à une variable comme ci-dessous:

 y="HELLO" val=$y| tr '[:upper:]' '[:lower:]' ssortingng=$val world 

Lorsque vous atsortingbuez la valeur ci-dessus, cela me donne un résultat vide.

PS: Ma version de Bash est 3.1.17

Si vous utilisez bash 4, vous pouvez utiliser l’approche suivante:

 x="HELLO" echo $x # HELLO y=${x,,} echo $y # hello z=${y^^} echo $z # HELLO 

Utilisez un seul ou ^ pour que la première lettre soit en lowercase ou en uppercase .

La manière correcte d’implémenter votre code est

 y="HELLO" val=$(echo "$y" | tr '[:upper:]' '[:lower:]') ssortingng="$val world" 

Cela utilise la notation $(...) pour capturer la sortie de la commande dans une variable. Notez également les guillemets autour de la variable ssortingng – vous en avez besoin pour indiquer que $val et world sont une seule chose à affecter à ssortingng .

Si vous avez bash 4.0 ou supérieur, une manière plus efficace et élégante de le faire est d’utiliser la manipulation de chaîne intégrée bash :

 y="HELLO" ssortingng="${y,,} world" 

Pourquoi ne pas exécuter dans les backticks?

  x=`echo "$y" | tr '[:upper:]' '[:lower:]'` 

Cela assigne le résultat de la commande dans les raccourcis à la variable x . (c.-à-d. qu’il n’est pas particulier à tr mais est un modèle / solution commun pour les scripts shell)

Vous pouvez utiliser $(..) au lieu des backticks. Voir ici pour plus d’informations.

Notez que tr ne peut gérer que des fichiers ASCII simples, empêchant toute solution à base de tr lorsque des caractères internationaux sont utilisés.

Il en va de même pour la solution ${x,,} basée sur bash 4.

L’outil awk , d’autre part, prend en charge même les entrées UTF-8 / multi-octets.

 y="HELLO" val=$(echo "$y" | awk '{print tolower($0)}') ssortingng="$val world" 

Réponse courtoisie de liborw .

Je suis sur Ubuntu 14.04, avec Bash version 4.3.11. Cependant, je n’ai toujours pas le plaisir de manipuler des chaînes de caractères intégrées ${y,,}

C’est ce que j’ai utilisé dans mon script pour forcer la capitalisation:

 CAPITALIZED=`echo "${y}" | tr '[az]' '[AZ]'` 

Cela a fonctionné pour moi. Merci Rody!

 y="HELLO" val=$(echo $y | tr '[:upper:]' '[:lower:]') ssortingng="$val world" 

une petite modification, si vous utilisez un tiret bas à côté de la variable Vous devez encapsuler le nom de la variable dans {}.

 ssortingng="${val}_world" 

Si vous définissez votre variable à l’aide de declare (old: typeset), vous pouvez indiquer la casse de la valeur dans l’utilisation de la variable.

 $ declare -u FOO=AbCxxx $ echo $FOO ABCXXX 

"-l" fait lc.