Take the 2-minute tour ×
Ask Ubuntu is a question and answer site for Ubuntu users and developers. It's 100% free.

What is the Bash command I can use to convert an upper-case string to lower-case and vice-versa?

Thank you.

share|improve this question
Lots of solutions at stackoverflow.com/questions/2264428/… too. With a cursory glance most seem to be covered here as well. –  pbhj Jul 2 at 10:39

7 Answers 7

up vote 28 down vote accepted

If the string is already stored in a variable you can use bash's parameter expansion, specifially ${parameter,,pattern}, 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^^}
share|improve this answer

There are very few methods that work correctly with Unicode:

GNU sed 4.2.2 works:

$ echo "Idą gęsi łąką" | sed 's/.*/\U&/'

bash 4.2.45 declare does not work:

$ typeset -u ucase; ucase="Idą gęsi łąką"; echo $ucase
IDą GęSI łąKą

bash 4.2.45 parameter expansion does not work:

$ str="Idą gęsi łąką"; echo ${str^^}
IDą GęSI łąKą

GNU tr 8.20 does not work:

$ echo "Idą gęsi łąką" | tr '[:lower:]' '[:upper:]'
IDą GęSI łąKą

mawk (default awk in Ubuntu 13.10) does not work:

$ echo "Idą gęsi łąką" | mawk '{print toupper($0)}'
IDą GęSI łąKą

gawk works:

$ echo "Idą gęsi łąką" | gawk '{print toupper($0)}'

Perl pure uc() does not work:

$ echo "Idą gęsi łąką" | perl -ne 'print uc($_);'
IDą GęSI łąKą

Python 2 without any Unicode hints does not work:

$ echo "Idą gęsi łąką" | python -c 'import sys; print sys.stdin.read().upper(),'
IDą GęSI łąKą

Python 2 when instructed to deal with Unicode works:

$ echo "Idą gęsi łąką" | python -c 'import sys; print sys.stdin.read().decode("utf-8").upper(),'

Python 3 works:

$ echo "Idą gęsi łąką" | python3 -c 'import sys; print(sys.stdin.read().upper(), end="")'
share|improve this answer
On Ubuntu 13.04, I have gawk as the default awk (as shown with update-alternatives --display awk). Are you sure mawk is the default in 13.10? –  minerz029 Dec 27 '13 at 22:10
seds since 1990 have supported the \U option ;-). Not a gnu-sed specific feature. Otherwise, great answer, so many options, so little time ;-) Good luck to all! –  shellter Oct 14 '14 at 0:28
Plus there will be some issues with Turkish (dotted and dotless i), for more look at the following links: - unicode.org/Public/UNIDATA/SpecialCasing.txt - stackoverflow.com/questions/23524231/… - en.wikipedia.org/wiki/Dotted_and_dotless_I –  azat Dec 10 '14 at 0:07

I would use the bash internal typeset or declare command to define a lowercase variable.

$ typeset -l lcase
$ lcase="LoWeR cAsE"
$ echo $lcase
lower case

The chars are lowered when the value is set, not when you typeset the variable. So it is better to typeset at the beginning of the script. For uppercase you can typeset -u.

$ typeset -u ucase
$ ucase="Upper cAsE"
$ echo $ucase

This is not specific to bash shell, that works also on ksh, maybe its in POSIX shell definition.

EDIT: Many people gently pointed me the fact that typeset is now considered obsolete on bash and replaced by declare. Both commands are equivalent.

$ help typeset
typeset: typeset [-aAfFgilrtux] [-p] name[=value] ...
    Set variable values and attributes.

    Obsolete.  See `help declare'.

$ help declare
declare: declare [-aAfFgilrtux] [-p] [name[=value] ...]
    Set variable values and attributes.

I myself still use the typeset syntax as I work on heterogeneous environment, so I have not to rewrite my scripts.

share|improve this answer
thank you.please add an example about uppercase also. –  Raja Nov 28 '13 at 15:34
+1 Incredible, i never knew that one ! b.t.w. some extra info: I looked this up in the manual and it seems that typeset is considered depricated and replaced by declare –  thom Nov 28 '13 at 16:15
@thom thank you, it seems that bash started to have a life far from its "bourne shell roots" :) –  Emmanuel Nov 28 '13 at 16:34

You can do it with the tr command.

In the terminal (Ctrl+Alt+T)

This command:

echo 'String here' | tr "[:lower:]" "[:upper:]"

will convert lowercase to uppercase.

echo 'STRING HERE' | tr "[:upper:]" "[:lower:]"

will convert uppercase to lowercase.


enter image description here

Credit goes to cybercity

share|improve this answer
If you don't care about locales, tr A-Z a-z will work as well. –  kundor Nov 28 '13 at 16:47

You can pipe things through sed too:

$ echo lowercase | sed 's/.*/\U&/'

And \L will have the opposite effect:

$ echo UPPERCASE | sed 's/.*/\L&/'
share|improve this answer

It's not a pure bash solution, but you can pipe your strings through perl (as Oli did with sed):

$ echo lowercase | perl -ne 'print "\U$_"'

And \L will have the opposite effect:

$ echo UPPERCASE | perl -ne 'print "\L$_"'
share|improve this answer

Use this simple command For upper to lower case Where 'f' is file name where you want to do conversion.

tr "A-Z" "a-z" < f

For lower to upper case

tr "a-z" "A-Z" < f
share|improve this answer
As noted in a comment on an older answer, this won't work for some locales. –  muru Oct 14 '14 at 0:29

Your Answer


By posting your answer, you agree to the privacy policy and terms of service.

Not the answer you're looking for? Browse other questions tagged or ask your own question.