web-dev-qa-db-fra.com

Comment convertir une chaîne de majuscules en minuscules dans Bash?

Je cherchais un moyen de convertir une chaîne de caractères majuscules en minuscules. Tous les résultats de la recherche montrent les 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 l'instruction echo. Par exemple:

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

Ce qui précède fonctionne et aboutit à 'bonjour', mais je dois affecter le résultat à une variable comme ci-dessous:

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

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

PS: Ma version de Bash est 3.1.17

76
raga

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 ^ faire la première lettre lowercase ou uppercase.

128
kev

La bonne façon de mettre en œuvre votre code est

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

Ceci utilise la notation $(...) pour capturer le résultat de la commande dans une variable. Notez également les guillemets autour de la variable string - vous en avez besoin pour indiquer que $val Et world sont une seule chose à affecter à string .

Si vous avez bash 4.0 ou supérieur, une manière plus efficace et plus élégante de le faire consiste à utiliser la manipulation de chaîne bash:

y="HELLO"
string="${y,,} world"
56
Rody Oldenhuis

Notez que tr ne peut gérer que l’ASCII ordinaire, ce qui fait que toute solution à base de tr échoue face aux caractères internationaux.

Il en va de même pour le bash 4 basé sur ${x,,} Solution.

L'outil awk, en revanche, supporte correctement même les entrées UTF-8/multi-octets.

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

Réponse gracieuseté de liborw .

17
DevSolar

Pourquoi ne pas exécuter en backticks?

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

Ceci assigne le résultat de la commande en contrôle inverse à la variable x. (c'est-à-dire que ce n'est pas particulier à tr mais c'est un modèle/solution courant pour les scripts Shell)

Vous pouvez utiliser $(..) à la place des backticks. Voir ici pour plus d'informations.

14
Brian Agnew

Je suis sur Ubuntu 14.04, avec la version 4.3.11 de Bash. Cependant, je n'ai toujours pas l'amusement construit dans la manipulation de chaîne ${y,,}

Voici ce que j'ai utilisé dans mon script pour forcer la capitalisation:

CAPITALIZED=`echo "${y}" | tr '[a-z]' '[A-Z]'`
6
BoomShadow

Si vous définissez votre variable en utilisant declare (old: typeset), vous pouvez alors définir la casse de la valeur tout au long de son utilisation.

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

"-l" fait lc.

5
Steven Powell

Cela a fonctionné pour moi. Merci Rody!

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

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

string="${val}_world"
2
Ray Moncada