0

I have the following shell script

#! /bin/bash

echo -e "Enter any character: \c"
read value

case $value in
    [a-z] )
        echo You have entered a lower case alphabet;;
    [A-Z] )
        echo You have entered an upper case alphabet;;
    [0-9] )
        echo You have entered a number;;
    [?] )
        echo You have entered a special character;;
    [*] )
        echo Unknown value;;
esac

Here, when I enter a upper case letter like

K

I get the output

You have entered a lower case alphabet

How to correct it?

1
1

In conjunction with steeldriver's collation link, the solution is to use sets as defined in man tr.

Also, a good reference for [[ vs [ Wooledge, GLOBS and why the following code may still fail with only [

  1 #! /bin/bash
  2 
  3 echo -e "Enter any character: \c"
  4 read -rN 1 value
  5 echo
  6 
  7 case $value in
  8     [[:lower:]] )
  9         echo You have entered a lower case alphabet;;
 10     [[:upper:]] )
 11         echo You have entered an upper case alphabet;;
 12     [[:digit:]] )
 13         echo You have entered a number;;
 14     [?] )
 15         echo You have entered a special character;;
 16     [*] )
 17         echo Unknown value;;
 18 esac

From wooledge link above:

Ranges

Globs can specify a range or class of characters, using square brackets. This gives you the ability to match against a set of characters. For example:

[abcd] Matches a or b or c or d

[a-d] The same as above, if globasciiranges is set or your locale is C or POSIX. Otherwise, implementation-defined.

[!aeiouAEIOU] Matches any character except a, e, i, o, u and their uppercase counterparts

[[:alnum:]] Matches any alphanumeric character in the current locale (letter or number)

[[:space:]] Matches any whitespace character

[![:space:]] Matches any character that is not whitespace

[[:digit:]_.] Matches any digit, or _ or .

For info on globasciiranges : Bash Reference Manual

1
  • Rather than making matters this much complex, a simple terminal writing LANG=C is much better. And steeldriver's link explains why LANG=C will work
    – Sonevol
    Jul 17 '17 at 9:35
0

Here, you need to set LANG as C

In terminal type

LANG=C

The LANG environment variable indicates the language/locale and encoding, where C is the language setting

2
  • Note that setting $LANG won't help if $LC_COLLATE or $LC_ALL is otherwise set. LC_ALL=C would ensure the C locale is used. Aug 7 '17 at 10:20
  • Note that with LANG=C/LC_ALL=C, it would fail to recognise É as an uppercase letter or π as a lowercase one for instance. See [[:upper:]]/[[:lower:]] for characters considered uppercase/lowercase in the current locale. Aug 7 '17 at 10:25

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

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