JONAS402
JONAS402

Reputation: 651

Simple bash script (input letter output number)

Hi I'm looking to write a simple script which takes an input letter and outputs it's numerical equivalent :-

I was thinking of listing all letters as variables, then have bash read the input as a variable but from here I'm pretty stuck, any help would be awesome!

#!/bin/bash

echo "enter letter"
read "LET"
a=1
b=2
c=3
d=4
e=5
f=6
g=7
h=8
i=9
j=10
k=11
l=12
m=13
n=14
o=15
p=16
q=17
r=18
s=19
t=20
u=21
v=22
w=23
x=24
y=25
z=26

LET=${a..z}
if
  $LET  = [ ${a..z} ];
  then
  echo $NUM
sleep 5
echo "success!"
sleep 1
exit
else
  echo "FAIL :("
exit
fi

Upvotes: 0

Views: 1220

Answers (5)

glenn jackman
glenn jackman

Reputation: 246847

late to the party: use an associative array:

# require bash version 4
declare -A letters
for letter in {a..z}; do
    letters[$letter]=$((++i))
done
read -p "enter a single lower case letter: " letter
echo "the value of $letter is ${letters[$letter]:-N/A}"

Upvotes: 0

michael501
michael501

Reputation: 1482

use these two functions to get chr and ord :

chr() {
   [ "$1" -lt 256 ] || return 1
   printf "\\$(printf '%03o' "$1")"
}

ord() {
  LC_CTYPE=C printf '%d' "'$1"
}


echo $(chr 97)

a

Upvotes: 1

user3442743
user3442743

Reputation:

USing od and tr

 echo "type letter: "
 read LET
 echo "$LET" | tr -d "\n" | od -An -t uC

OR using -n

echo -n "$LET" | od -An -t uC

If you want it to start at a=1

echo $(( $(echo -n "$LET" | od -An -t uC) - 96 ))

Explanation

Pipes into the tr to remove the newline. Use od to change to unsigned decimal.

Upvotes: 0

gniourf_gniourf
gniourf_gniourf

Reputation: 46833

A funny one, abusing Bash's radix system:

read -n1 -p "Type a letter: " letter
if [[ $letter = [[:alpha:]] && $letter = [[:ascii:]] ]]; then
    printf "\nCode: %d\n" "$((36#$letter-9))"
else
    printf "\nSorry, you didn't enter a valid letter\n"
fi

The interesting part is the $((36#$letter-9)). The 36# part tells Bash to understand the following string as a number in radix 36 which consists of a string containing the digits and letters (case not important, so it'll work with uppercase letters too), with 36#a=10, 36#b=11, …, 36#z=35. So the conversion is just a matter of subtracting 9.

The read -n1 only reads one character from standard input. The [[ $letter = [[:alpha:]] && $letter = [[:ascii:]] ]] checks that letter is really an ascii letter. Without the [[:ascii:]] test, we would validate characters like é (depending on locale) and this would mess up with the conversion.

Upvotes: 2

Mei
Mei

Reputation: 80

Try this:

echo "Input letter"
read letter
result=$(($(printf "%d\n" \'$letter) - 65))
echo $result

0

ASCII equivalent of 'A' is 65 so all you've got to do to is to take away 65 (or 64, if you want to start with 1, not 0) from the letter you want to check. For lowercase the offset will be 97.

Upvotes: 3

Related Questions