Komut satırı argümanı nasıl büyük harflendirilir?


125

SO'yu aradım ve izleyen bir dizgenin büyük harfle çalışacağını öğrendim

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

Ancak komut satırındaki bir argümana benzer bir şey yapmaya çalıştım, bu da bana şu hatayı verdi.

Denenmiş

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

Bunu nasıl yapabiliriz?


8
Benim için işe yarıyor . Komut dosyanızı yayınlayın, hata muhtemelen başka bir yerdedir. Shebang'ınız işaret bashmi ediyor ?
Manatwork

Yanıtlar:


151

Çalıştığınız sözdizimi str^^Bash 4.0 ve üzeri sürümlerde bulunabilir. Belki de sizinki daha eski bir sürümdür (veya komut dosyasını shaçıkça çalıştırdınız):

Bunu dene:

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

1
MTK'nin sözlerinden, dava değişikliğinin aslında onun için değişkenlerle çalıştığını anladım.
Manatwork

1
@manatwork İlk soruda açıkça ifade edilmemiştir. Kötü değiştirme hatası iletisi, eski bash sürümleriyle alabileceğinizle aynıdır.
Bernhard

4
Haklısın. 3.2.25 versiyonunu kontrol ettim. Çözümün işe yarıyor ve ben de denedim tr '[a-z]' [[A-Z]'.
mtk

20
@mtk Bu olmalı tr '[a-z]' '[A-Z]'.
l0b0

2
Koşuyorum GNU bash, version 4.3.42(1)-release (x86_64-apple-darwin14.5.0), ben OP aynı hatayı alıyorum, bu yüzden bu herhangi geçerli olduğunu düşünmüyorum bash4.0 ve dediğin gibi yukarıda.
Heath

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

Çıktı:

LOWERCASE

1
Ben POSIX gerektirmez düşünüyorum /olarak tr /a-z/ /A-Z/benim düzenlemem önce: Bu değiştirdiğinden bu sadece çalışır /tarafından /ancak faydasız: pubs.opengroup.org/onlinepubs/9699919799/utilities/tr.html da daha belirsiz ve daha az kullanışlı söz konusudur tr '[:lower:]' '[:upper:]'.
Ciro Santilli,

Doğru. tr çok farklı, ama işe yarıyor.
Doug

umlautlar bununla çalışmıyor.
Evgeny

22

Tüm kullandığınız AZ olmadıkça, tr ile dikkatli olun. Diğer yerler için '[: lower:]' '[: upper:]' bile başarısız olur, yalnızca awk takımın kabarcığı ve bash (v4 +) çalışır

$ 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:]'şimdi örnek için OS X üzerinde çalışıyor (en azından LC_ALL=sv_SE)
Ethan

1

Alternatif olarak, (uzun öncesinde uzun yıllar boyunca küçük harf dönüştürme desteği oldu ksh veya zsh geçiş olabilir bash's ${var^^}farklı bir söz dizimi ile birlikte, 4.0 katma):

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

(ayrıca zsh; pdksh / mksh'de yalnızca ASCII harfleri için çalıştığını unutmayın).

İle parametre genişletme bayrağını zshda kullanabilirsiniz U:

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

POSIXLY, kullanabilirsiniz:

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

Ayrıca:

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

Ancak GNU dahil olmak üzere birkaç uygulamada, trbu yalnızca tek baytlık karakterler için çalışır (yani UTF-8 yerellerinde, yalnızca ASCII harflerinde).


0

Birisi hala denemekte hata alıyorsa ${str^^}, deneyebilirsiniz python -cveya perlbash sürümünün 4'ten düşük olması olasıdır.

Ancak, şu ana kadar bash 4 veya üstü mevcut çözümle hızlı bir şekilde çalışıyor.

L2U="I will be upper"

python -cBash kullanarak

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

Benzer şekilde, aşağıdakiler ile büyük harf kullanmak için de kullanılabilir :

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

kullanma perl

echo $L2U | perl -ne 'print "\U$_"'
I WILL BE UPPER
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.