Saya mencari SO dan menemukan bahwa huruf besar mengikuti string akan bekerja
str="Some string"
echo ${str^^}
Tapi saya mencoba melakukan hal serupa pada argumen baris perintah, yang memberi saya kesalahan berikut
Mencoba
#!/bin/bash
## Output
echo ${1^^} ## line 3: ${1^^}: bad substitution
echo {$1^^} ## No error, but output was still smaller case i.e. no effect
Bagaimana kita bisa melakukan ini?
bash
?Jawaban:
Sintaks
str^^
yang Anda coba tersedia dari Bash 4.0 ke atas. Mungkin versi Anda yang lebih lama (atau Anda menjalankan skrip dengansh
secara eksplisit):Coba ini:
sumber
tr '[a-z]' [[A-Z]'
.tr '[a-z]' '[A-Z]'
.GNU bash, version 4.3.42(1)-release (x86_64-apple-darwin14.5.0)
, dan saya mendapatkan kesalahan yang sama seperti OP, jadi saya tidak berpikir ini tersedia padabash
4.0 dan di atas seperti yang Anda katakan.Keluaran:
sumber
/
seperti padatr /a-z/ /A-Z/
sebelum edit saya: ini hanya berfungsi karena diganti/
oleh/
tetapi tidak berguna: pubs.opengroup.org/onlinepubs/9699919799/utilities/tr.html Ada juga ada yang lebih jelas dan kurang bermanfaattr '[:lower:]' '[:upper:]'
.Hati-hati dengan tr kecuali AZ yang Anda gunakan. Untuk lokal lain bahkan '[: bawah:]' '[: atas:]' gagal, hanya toupper dan bash (v4 +) yang berfungsi
sumber
tr '[:lower:]' '[:upper:]'
sekarang berfungsi untuk contoh Anda di OS X setidaknya (juga denganLC_ALL=sv_SE
)Atau, Anda bisa beralih ke ksh atau zsh yang memiliki kasus dukungan konversi selama puluhan tahun (jauh sebelum
bash
's${var^^}
ditambahkan dalam 4.0), meskipun dengan sintaks yang berbeda:(juga berfungsi dengan
zsh
; perhatikan bahwa dalam pdksh / mksh, itu hanya berfungsi untuk huruf ASCII).Dengan
zsh
, Anda juga dapat menggunakanU
flag ekspansi parameter:POSIXLY, Anda dapat menggunakan:
Ada juga:
Tetapi dalam beberapa implementasi, termasuk GNU
tr
, itu hanya berfungsi untuk karakter single-byte (jadi di lokal UTF-8, hanya pada huruf ASCII).sumber
Jika seseorang masih mendapatkan kesalahan saat mencoba
${str^^}
, Anda dapat mencobapython -c
atauperl
Kemungkinan karena versi bash lebih rendah dari 4.Tapi, sejauh ini bash 4 atau lebih bekerja dengan cepat dengan solusi yang ada.
Menggunakan
python -c
di bashDemikian pula itu juga dapat digunakan untuk bermodalkan :
Menggunakan
perl
sumber