If the string is already stored in a variable you can use bash
's parameter expansion, specifially ${parameter,,pattern}
(available since bash 4.0), where parameter
is the name of your variable and pattern
is ommitted:
$ string="Hello, World!"
$ echo $string
Hello, World!
$ echo ${string,,}
hello, world!
Note that this does not change the value of the variable, only the output. To change the variable you have to assign the new value:
$ echo $string
Hello, World!
$ string=${string,,}
$ echo $string
hello, world!
The upper-case conversion works with ${parameter^^pattern}
:
$ echo ${string^^}
HELLO, WORLD!
This works also with Unicode strings (at least with current bash versions, probably needs at least bash 4.3):
$ string='ἈΛΦΆβητος'
$ echo ${string,,}
ἀλφάβητος
$ echo ${string^^}
ἈΛΦΆΒΗΤΟΣ
If you are using zsh
, you can use Parameter Expansion Flags (${(FLAGS)NAME}
; available since zsh 2.5) to achieve the same results. The bash
syntax does not work in zsh
1). The flag for lower case is L
; for upper case it is U
:
$ string="Hello, World!"
$ echo ${(L)string}
hello, world!
$ echo ${(U)string}
HELLO, WORLD!
$ echo $string
Hello, World!"
This also works with Unicode strings (at least since zsh 5.0; I did not try with earlier versions):
$ string='ἈΛΦΆβητος'
$ echo ${(L)string}
ἀλφάβητος
$ echo ${(U)string}
ἈΛΦΆΒΗΤΟΣ
1) Although, seeing that zsh had this for far longer, it should probably be: "the zsh
syntax does not work in bash
.
Best Answer
That's because the glob pattern
[A-Z]
does not generally correspond to uppercase letters. Specifically it expands according toIf you want files starting with an upper case letter, you can use
or set the locale explicitly
or use the bash
globasciiranges
shell optionSee the
Pattern matching
section ofman bash