web-dev-qa-db-fra.com

Comment mettre en majuscule l'argument de la ligne de commande?

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

A essayé

#!/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?

134
mtk

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) }'
160
Guru
echo "lowercase" | tr a-z A-Z

Production:

LOWERCASE
96
Johner Ramirez

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åäö
25
lpaseen

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).

1
Stéphane Chazelas

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
0
Rakib Fiha