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
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
.
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"
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 .
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.
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]'`
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.
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"