Przeszukałem SO i stwierdziłem, że wielkie litery będą działać
str="Some string"
echo ${str^^}
Ale próbowałem zrobić podobną rzecz w argumencie wiersza poleceń, co dało mi następujący błąd
Wypróbowany
#!/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 możemy to zrobić?
bash
?Odpowiedzi:
Próbowana przez
str^^
ciebie składnia jest dostępna w wersji Bash 4.0 i nowszych. Być może twoja jest starszą wersją (lub uruchomiłeś skryptsh
jawnie):Spróbuj tego:
źródło
tr '[a-z]' [[A-Z]'
.tr '[a-z]' '[A-Z]'
.GNU bash, version 4.3.42(1)-release (x86_64-apple-darwin14.5.0)
i otrzymuję ten sam błąd co OP, więc nie sądzę, że jest to dostępne w żadnej wersjibash
4.0 i wyższej, jak mówisz.Wynik:
źródło
/
jak wtr /a-z/ /A-Z/
przed moim edit: to właśnie działa, ponieważ zastępuje/
przez/
ale jest bezużyteczny: pubs.opengroup.org/onlinepubs/9699919799/utilities/tr.html Istnieje również istnieje bardziej niejasne i mniej użytecznetr '[:lower:]' '[:upper:]'
.Uważaj na tr, chyba że używasz tylko AZ. W przypadku innych ustawień regionalnych nawet „[: dolny:]” „[: górny:]” nie działa, działa tylko tupper i bash awk (v4 +)
źródło
tr '[:lower:]' '[:upper:]'
pracuje teraz dla twojego przykładu na OS X przynajmniej (także zLC_ALL=sv_SE
)Alternatywnie, można przełączyć się do ksh lub zsh które miały case wsparcie konwersji dziesięcioleci (na długo przed
bash
„s${var^^}
dodanych w wersji 4.0), choć z różną składnię:(działa również z
zsh
; zauważ, że w pdksh / mksh, który działa tylko dla liter ASCII).Za pomocą
zsh
można również użyćU
flagi ekspansji parametrów:POSIXLY możesz użyć:
Jest także:
Ale w kilku implementacjach, w tym GNU
tr
, działa to tylko dla znaków jednobajtowych (tak więc w ustawieniach regionalnych UTF-8, tylko dla liter ASCII).źródło
Jeśli ktoś nadal otrzymuje komunikat o błędzie
${str^^}
, możesz spróbowaćpython -c
lubperl
Prawdopodobnie, ponieważ wersja bash jest mniejsza niż 4.Ale jak dotąd bash 4 lub nowszy działa szybko z istniejącym rozwiązaniem.
Używanie
python -c
w bashuPodobnie można go również użyć do wielkich liter :
Za pomocą
perl
źródło