Hledal jsem SO a zjistil jsem, že na velká písmena bude fungovat následující řetězec)
str="Some string"
echo ${str^^}
Ale pokusil jsem se udělat něco podobného na argumentu příkazového řádku, který mi dal následující chybu
#!/bin/bash
## Output
echo ${1^^} ## line 3: ${1^^}: bad substitution
echo {$1^^} ## No error, but output was still smaller case i.e. no effect
Jak bychom to mohli udělat?
Syntaxe str^^
, které se pokoušíte, je k dispozici od Bash 4.0 a výše. Možná je vaše starší verze (nebo jste spustili skript s explicitně sh
):
Zkuste to:
str="Some string"
printf '%s\n' "$str" | awk '{ print toupper($0) }'
echo "lowercase" | tr a-z A-Z
Výstup:
LOWERCASE
Buďte opatrní s tr, pokud A-Z není vše, co používáte. Pro jiné národní prostředí dokonce selže „[: nižší:]“ „[: horní:]“, funguje pouze awkova toupper a bash (v4 +)
$ 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åäö
Alternativně byste mohli přejít na ksh nebo zsh, kteří měli podporu převodu případů po celá desetiletí (dlouho před přidáním ${var^^}
bash
, ale s jinou syntaxí:
#! /bin/ksh -
typeset -u upper="$1"
printf '%s\n' "$upper"
(funguje také s zsh
; v pdksh/mksh funguje pouze pro písmena ASCII).
Pomocí zsh
můžete také použít příznak rozšíření parametru U
:
#! /bin/zsh -
printf '%s\n' "${(U)1}"
POSIXLY můžete použít:
awk 'BEGIN{print toupper(ARGV[1])}' "$1"
K dispozici je také:
printf '%s\n' "$1" | tr '[:lower:]' '[:upper:]'
Ale v několika implementacích, včetně GNU tr
, to funguje pouze pro jednobajtové znaky (takže v lokalizacích UTF-8, pouze u ASCII písmen).
Pokud se někdo stále pokouší o pokus o ${str^^}
, si můžete vyzkoušet python -c
nebo Perl
Je pravděpodobné, že bash verze je nižší než 4.
Ale zatím bash 4 nebo přes pracuje rychle s existujícím řešením.
L2U="I will be upper"
Použitím python -c
in bash
python -c "print('$L2U'.upper())"
I WILL BE UPPER
Podobně lze také použít k kapitalizaci pomocí:
service="bootup.sh on home"
python -c "print('$service'.capitalize())"
Bootup.sh on home
Pomocí Perl
echo $L2U | Perl -ne 'print "\U$_"'
I WILL BE UPPER