Ömer An
Ömer An

Reputation: 664

bash bc command converts uppercase letters to 9

I pipe different values to bc.

If the value is a number, it works fine. If it's a string with lowercase letters, it returns 0 which makes sense to me, but if it's uppercase letters, bc converts it to 9 as the length of the input characters:

echo 1 | bc
1

echo aaa | bc
0

echo AAA | bc
999

echo FO | bc
99

echo null | bc
0

echo NULL | bc
9999

Why does bc have this behavior? What's the best way to work with unexpected string values?

Upvotes: 2

Views: 162

Answers (1)

Yunnosch
Yunnosch

Reputation: 26753

According to https://www.gnu.org/software/bc/manual/html_mono/bc.html
(emphasis by me):

A simple expression is just a constant. bc converts constants into internal decimal numbers using the current input base, specified by the variable ibase. (There is an exception in functions.) The legal values of ibase are 2 through 16. Assigning a value outside this range to ibase will result in a value of 2 or 16. Input numbers may contain the characters 0-9 and A-F. (Note: They must be capitals. Lower case letters are variable names.) Single digit numbers always have the value of the digit regardless of the value of ibase. (i.e. A = 10.) For multi-digit numbers, bc changes all input digits greater or equal to ibase to the value of ibase-1. This makes the number FFF always be the largest 3 digit number of the input base.

So, assuming that your ibase is 10 your observation is explained.
It is unrelated to "unexected string values" or "the length of the input characters". bc does consider them (somewhat odd) attempts to provide numeric values and converts and uses them according to the quoted rule.

Upvotes: 2

Related Questions