J'ai recherché SO et trouvé que pour mettre en majuscule une chaîne suivante fonctionnerait
str="Some string"
echo ${str^^}
Mais j'ai essayé de faire une chose similaire sur un argument de ligne de commande, ce qui m'a donné l'erreur suivante
#!/bin/bash
## Output
echo ${1^^} ## line 3: ${1^^}: bad substitution
echo {$1^^} ## No error, but output was still smaller case i.e. no effect
Comment pourrions-nous faire cela?
La syntaxe str^^
que vous essayez est disponible à partir de Bash 4.0 et supérieur. La vôtre est peut-être une ancienne version (ou vous avez exécuté le script avec sh
explicitement):
Essaye ça:
str="Some string"
printf '%s\n' "$str" | awk '{ print toupper($0) }'
echo "lowercase" | tr a-z A-Z
Production:
LOWERCASE
Soyez prudent avec tr sauf si A-Z est tout ce que vous utilisez. Pour les autres paramètres régionaux, même '[: lower:]' '[: upper:]' échoue, seuls les fonctions toupper et bash (v4 +) d'awk fonctionnent
$ str="abcåäö"
$ echo "$str"|tr '/a-z/' '/A-Z/'
ABCåäö
$ echo "$str"|LC_ALL=sv_SE tr '[:lower:]' '[:upper:]'
ABCåäö
$ echo "$str"|awk '{print toupper($0)}'
ABCÅÄÖ
$ echo ${str^^} # Bash 4.0 and later
ABCÅÄÖ
$ STR="ABCÅÄÖ"
$ echo ${STR,,}
abcåäö
Alternativement, vous pouvez basculer vers ksh ou zsh qui ont pris en charge la conversion de casse pendant des décennies (bien avant que bash
${var^^}
ajouté dans 4.0), mais avec une syntaxe différente:
#! /bin/ksh -
typeset -u upper="$1"
printf '%s\n' "$upper"
(fonctionne également avec zsh
; notez que dans pdksh/mksh, cela ne fonctionne que pour les lettres ASCII).
Avec zsh
, vous pouvez également utiliser l'indicateur d'expansion de paramètre U
:
#! /bin/zsh -
printf '%s\n' "${(U)1}"
POSIXLY, vous pouvez utiliser:
awk 'BEGIN{print toupper(ARGV[1])}' "$1"
Il y a aussi:
printf '%s\n' "$1" | tr '[:lower:]' '[:upper:]'
Mais dans quelques implémentations, y compris GNU tr
, cela ne fonctionne que pour les caractères à un octet (donc dans les locales UTF-8, uniquement sur les lettres ASCII).
Si quelqu'un rencontre toujours une erreur en essayant ${str^^}
, tu peux essayer python -c
ou Perl
C'est probablement parce que la version bash est inférieure à 4.
Mais, jusqu'à présent, bash 4 ou plus fonctionne rapidement avec la solution existante.
L2U="I will be upper"
En utilisant python -c
en bash
python -c "print('$L2U'.upper())"
I WILL BE UPPER
De même, il peut également être utilisé pour mettre en majuscule avec:
service="bootup.sh on home"
python -c "print('$service'.capitalize())"
Bootup.sh on home
en utilisant Perl
echo $L2U | Perl -ne 'print "\U$_"'
I WILL BE UPPER