8.2. Numerical Constants. Comtrol DeviceMaster Software Development Kit
Annonce
Annonce
Advanced Bash-Scripting Guide if [ "$a" -eq 98 -o "$b" -eq 47 ] then
echo "Test #4 succeeds." else
echo "Test #4 fails." fi a=rhino b=crocodile if [ "$a" = rhino ] && [ "$b" = crocodile ] then
echo "Test #5 succeeds." else
echo "Test #5 fails." fi exit 0
The && and || operators also find use in an arithmetic context.
bash$
echo $(( 1 && 2 )) $((3 && 0)) $((4 || 0)) $((0 || 0))
1 0 1 0
,
miscellaneous operators
Comma operator
The comma operator chains together two or more arithmetic operations. All the operations are evaluated (with possible side effects. [39] let "t1 = ((5 + 3, 7 - 1, 15 - 4))" echo "t1 = $t1" ^^^^^^ # t1 = 11
# Here t1 is set to the result of the last operation. Why?
let "t2 = ((a = 9, 15 / 3))" # Set "a" and calculate "t2".
echo "t2 = $t2 a = $a" # t2 = 5 a = 9
The comma operator finds use mainly in for loops. See Example 11-13.
8.2. Numerical Constants
A shell script interprets a number as decimal (base 10), unless that number has a special prefix or notation. A number preceded by a
0
is
octal
(base 8). A number preceded by
0x
is
hexadecimal
(base 16). A number with an embedded
#
evaluates as
BASE#NUMBER
(with range and notational restrictions).
Example 8-4. Representation of numerical constants
#!/bin/bash
# numbers.sh: Representation of numbers in different bases.
# Decimal: the default let "dec = 32" echo "decimal number = $dec" # 32
Chapter 8. Operations and Related Topics 78
Advanced Bash-Scripting Guide
# Nothing out of the ordinary here.
# Octal: numbers preceded by '0' (zero) let "oct = 032" echo "octal number = $oct" # 26
# Expresses result in decimal.
# --------- ------ -- -------
# Hexadecimal: numbers preceded by '0x' or '0X' let "hex = 0x32" echo "hexadecimal number = $hex" # 50 echo $((0x9abc)) # 39612
# ^^ ^^ double-parentheses arithmetic expansion/evaluation
# Expresses result in decimal.
# Other bases: BASE#NUMBER
# BASE between 2 and 64.
# NUMBER must use symbols within the BASE range, see below.
let "bin = 2#111100111001101" echo "binary number = $bin" # 31181 let "b32 = 32#77" echo "base-32 number = $b32" # 231 let "b64 = 64#@_" echo "base-64 number = $b64" # 4031
# This notation only works for a limited range (2 - 64) of ASCII characters.
# 10 digits + 26 lowercase characters + 26 uppercase characters + @ + _ echo echo $((36#zz)) $((2#10101010)) $((16#AF16)) $((53#1aA))
# 1295 170 44822 3375
# Important note:
# --------------
# Using a digit out of range of the specified base notation
#+ gives an error message.
let "bad_oct = 081"
# (Partial) error message output:
# bad_oct = 081: value too great for base (error token is "081")
# Octal numbers use only digits in the range 0 - 7.
exit $? # Exit value = 1 (error)
# Thanks, Rich Bartell and Stephane Chazelas, for clarification.
Chapter 8. Operations and Related Topics 79
Download
Annonce