Come maiuscolo l'argomento della riga di comando?


125

Ho cercato SO e ho scoperto che per maiuscole una stringa seguente avrebbe funzionato

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

Ma ho provato a fare una cosa simile su un argomento della riga di comando, che mi ha dato il seguente errore

Provato

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

Come potremmo farlo?


8
Esso funziona per me più che bene. Pubblica l'intero script, l'errore è probabilmente altrove. Il tuo shebang sta indicando bash?
arte

Risposte:


151

La sintassi str^^che stai provando è disponibile da Bash 4.0 e versioni successive. Forse la tua è una versione precedente (o hai eseguito lo script in modo shesplicito):

Prova questo:

str="Some string"
printf '%s\n' "$str" | awk '{ print toupper($0) }'

1
Dalle parole di mtk ho capito che la modifica del caso funziona davvero con lui con le variabili.
arte

1
@manatwork Questo non è chiaramente indicato nella domanda iniziale. Il messaggio di errore di sostituzione errata è lo stesso che otterresti con le versioni bash precedenti.
Bernhard,

4
Hai ragione. Ho controllato la versione, la sua 3.2.25. La tua soluzione funziona e anche io ho provato tr '[a-z]' [[A-Z]'.
mtk

20
@mtk Dovrebbe essere tr '[a-z]' '[A-Z]'.
l0b0,

2
Sto correndo GNU bash, version 4.3.42(1)-release (x86_64-apple-darwin14.5.0)e ricevo lo stesso errore di OP, quindi non credo che sia disponibile su qualsiasi versione bash4.0 e successive come dici tu.
Heath Borders,

79
echo "lowercase" | tr a-z A-Z

Produzione:

LOWERCASE

1
Penso POSIX non richiede l' /come nella tr /a-z/ /A-Z/prima che il mio edit: questo solo funziona perché sostituisce /da /, ma è inutile: pubs.opengroup.org/onlinepubs/9699919799/utilities/tr.html Esiste anche il più oscuro e meno utile tr '[:lower:]' '[:upper:]'.
Ciro Santilli 新疆 改造 中心 法轮功 六四 事件

Corretta. tr è molto diverso, ma funziona.
Doug,

umlaut non funziona con questo.
Evgeny,

22

Fai attenzione con tr a meno che AZ non sia tutto ciò che usi. Per altre versioni locali anche '[: lower:]' '[: upper:]' fallisce, funziona solo tokupp e bash (v4 +) di awk

$ 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åäö

1
FWIW, tr '[:lower:]' '[:upper:]'funziona ora per il tuo esempio almeno su OS X (anche con LC_ALL=sv_SE)
Ethan

1

In alternativa, si potrebbe passare a ksh o zsh che hanno avuto il supporto di conversione caso per decenni (molto prima che bash's ${var^^}aggiunti a 4,0), anche se con una sintassi diversa:

#! /bin/ksh -
typeset -u upper="$1"
printf '%s\n' "$upper"

(funziona anche con zsh; nota che in pdksh / mksh, funziona solo con lettere ASCII).

Con zsh, puoi anche usare il Uflag di espansione dei parametri:

#! /bin/zsh -
printf '%s\n' "${(U)1}"

POSIX, puoi usare:

awk 'BEGIN{print toupper(ARGV[1])}' "$1"

C'è anche:

printf '%s\n' "$1" | tr '[:lower:]' '[:upper:]'

Ma in alcune implementazioni, tra cui GNU tr, funziona solo per caratteri a byte singolo (quindi nelle versioni locali UTF-8, solo su lettere ASCII).


0

Se qualcuno sta ancora riscontrando un errore nel tentativo ${str^^}, puoi provare python -co perlÈ probabile perché la versione bash è inferiore a 4.

Ma finora bash 4 o superiore sta lavorando rapidamente con la soluzione esistente.

L2U="I will be upper"

Usando python -cin bash

python -c "print('$L2U'.upper())"
I WILL BE UPPER

Allo stesso modo può anche essere usato per capitalizzare con:

service="bootup.sh on home"
python -c "print('$service'.capitalize())"
Bootup.sh on home

utilizzando perl

echo $L2U | perl -ne 'print "\U$_"'
I WILL BE UPPER
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.