[Linux Shell学习系列五]Shell编程基础-Shell算数运算
1. Bash的算术运算符
Bash的算术运算符以及它们的优先级、结合性和值都与C语言相同。
下表优先级从高到低排列。
| 操作符 | 用途 |
| id++ id-- | 变量后递增和后递减 |
| ++id --id | 变量前递增和前递减 |
| - + | 单目负号和正号 |
| ! ~ | 逻辑取反,按位取反 |
| ** | 求幂 |
| * / % | 乘,除,求余 |
| + - | 加,减 |
| << >> | 按位左移,按位右移 |
| <= >= <> | 比较 |
| == != | 相等,不等 |
| & | 按位与 |
| ^ | 按位异或 |
| | | 按位或 |
| && | 逻辑与 |
| || | 逻辑或 |
| expr?expr:expr | 条件运算符 |
| = *= /= %= += -= <<= >>= &= ^= |= | 赋值 |
| expr1,expr2 | 逗号运算(主要在for循环中使用) |
逗号运算符:将两个或更多的算术运算连接在一起,所有的运算都被求值,但只有最后一个运算的值被返回。
$ let nums=(2+3, 10-5, 20-6) $ echo $nums 14 $ let nums=(var1=10, 10%3) $ echo $var 1 $ echo $var1 10
2. 数字常量
默认情况下,Shell算术表达式都使用十进制数。
$ let dec=20 #默认为10进制数 $ echo "Decimal number: $dec" Decimal number: 20 $ let oct=020 #以0开头的八进制数 $ echo "Octal number: $oct" Octal number: 16 $ let hex=0x20 #以0x开头的16进制数 $ echo "Hexadecimal number: $hex" Hexadecimal number: 32 $ let bin=2#111 #以#前的数字2表示的2进制数 $ echo "binary number: $bin" binary number: 7 $ let base32=32#20 #以#前的数字32表示的32进制数 $ echo "Base-32 number: $base32" Base-32 number: 64 $ let base64=64#@_ #以#前的数字64表示的64进制数:0-9用0-9表示,10-35用小写字母a~z表示,36~61用大写字母A~Z表示,62用@表示,63用_表示 $ echo "Base-64 number: $base64" Base-64 number: 4031
3. 使用算术扩展和let进行算术运算
算术扩展可以对算术表达式求值并替换成所求得的值。
格式:$ $((EXPRESSION))
算术表达式中所有符号都会进行参数扩展、字符串扩展、命令替换和引用去除。
算术表达式可以嵌套。
如果算术表达式无效,Bash打印错误信息,且不会进行任何替换。
$ var=6 $ var=$(( $var + 7 )) #变量作为运算数,与$(( var + 7 ))结果相同 $ echo $var 13
$ x=17 $ y=2$ z=$(( x%y )) #求余运算 $ echo $z 1
$ echo $(( 10>3 )) #比较运算符>,条件为真返回1,否则返回0 1
$ a=28 $ b=25 $ c=$(( $(( a>b ))?a:b )) #条件表达式?前的表达式运算结果为真或大于1,则输出a,否则输出b $ echo $c 28
let命令是Bash的内部命令,同样可以用于算术表达式的求值。
按照从左到右的顺序将提供给它的每一个参数进行算术表达式的求值。求职运算只能使用固定宽度的整数且不检查溢出,但可以捕获除以0的情况并报错。当最后一个参数求值结果为1,返回退出码0,否则返回退出码1。
let命令默认要求任何操作符两边不能有空格,即所有算术表达式要连接在一起。若要在算术表达式的符号之间使用空格,必须使用""将算术表达式括起。
$ let i=i+5 $ echo $i 5 $ let i=i + 5 #默认情况下,let不允许运算符左右包含空格 -bash: let: +: syntax error: operand expected (error token is "+") $ let "i= i + 5" #运算符左右包含空格,需使用双引号 $ echo $i 10 $ let i=1 $ let "i <<= 3" #左移3位并赋值 $ echo $i 8 $ let i++ #变量后递增加1 $ echo $i 9 $ let "i = i < 6 ? i : 6" #?前的表达式为真则输出i,否则输出6 $ echo $i 6
4. 使用expr命令
expr命令是一个用于对表达式进行求值并输出相应结果的命令行工具。同样只支持整数运算数,不支持浮点运算数。
与let命令相反,使用expr命令时,表达式的运算符左右必须包含空格,如果没有空格,expr命令不会对表达式进行求值,而是直接输出算术表达式。
使用expr命令时,对于某些运算符,还需要\进行转义,否则提示语法错误。
使用expr命令给变量赋值时,需要使用Shell扩展中的命令替换(''或$())。
$ expr 6 + 8 #运算符左右必须有空格 14 $ expr 6+8 #运算符左右没有空格则输出表达式 6+8 $ expr 6 * 8 #运算符*需要转义 expr: syntax error $ expr 6 \* 8 48 $ expr 1 \< 2 #运算符<需要转义 1 $ expr 2 \>= 5 #运算符>=需要转义 0 $ a=15 $ b=35 $ expr $a \* $b #运算 525 $ c=`expr $a \* $b` #使用expr表达式的命令替换,对变量赋值 $ echo $c 525 $ c=$( expr $a \* $b ) #使用expr表达式的命令替换,对变量赋值 $ echo $c 525
本节结束
欢迎大家评论交流,发现博文中存在的问题一定要留言哦

浙公网安备 33010602011771号