Como colocar em maiúsculas o argumento da linha de comando?

91

Eu procurei o SO e descobri que, para maiúsculas, uma sequência de caracteres funcionaria

str="Some string"
echo ${str^^}

Mas eu tentei fazer algo semelhante em um argumento de linha de comando, o que me deu o seguinte erro

Tentou

#!/bin/bash
             ## Output
echo ${1^^}  ## line 3: ${1^^}: bad substitution
echo {$1^^}  ## No error, but output was still smaller case i.e. no effect

Como poderíamos fazer isso?

    
por mtk 16.10.2012 / 14:27

3 respostas

122

A sintaxe str^^ que você está tentando está disponível no Bash 4.0 e acima. Talvez o seu seja uma versão mais antiga:

Tente isto:

str="Some string"
echo $str | awk '{print toupper($0)}'
    
por 16.10.2012 / 14:42
41
echo "lowercase" | tr a-z A-Z

Saída:

LOWERCASE
    
por 14.02.2017 / 04:08
12

Tenha cuidado com o tr, a menos que A-Z seja tudo o que você usa. Para outras localidades, mesmo '[: lower:]' '[: upper:]' falha, somente o toupper do awk e o bash (v4 +) funciona

$ 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åäö
    
por 21.02.2017 / 21:46