目录
1、expr
expr 1+5
# 得到结果6
expr 5 \* 2
# *容易被shell错误解释,需要用转义字符标出来
# 得到结果10
在shell脚本中使用expr命令也复杂,要将一个数学算式的结果赋给一个变量,需要使用命令替换来获取expr命令的输出。
2、使用方括号
bash shell有一个针对处理数学运算符的改进:使用方括号,($[ operation ])。
var1=$[1+5]
echo $var1
# echo用于显示字符输出,结果是6
# 在脚本中同样适用
#!/bin/bash
var1=100
var2=50
var3=45
var4=$[$var1*($var2-$var3)]
echo The final result is $var4
# 以上是脚本文件file1的内容
# 在命令交互界面执行以下命令
chmod u+x file1 # 只授予这个文件的所属者(u)执行的权限
./file1
# 输出结果是500
但bash shell数学运算符只支持整数运算。
3、浮点数运算
1)内建bash计算器:bc
bash计算器能够识别:
- 数字(整数和浮点数)
- 变量(简单变量和数组)
- 注释(以#或 /* */ 开始的行)
- 表达式
- 编程语句(如,if-then语句)
- 函数
# 在shell提示符下使用bc命令访问bash计算器
bc
bc 1.06.95
Copyright 1991-1994, 1997, 1998, 2000, 2004, 2006 Free Software Foundation, Inc.
This is free software with ABSOLUTELY NO WARRANTY.
For details type `warranty'.
11*5.3
58.3
13*3.5
45.5
5*6.7
33.5
quit
# quit命令表示退出bash计算器
#浮点运算由内建scale控制,必须设置想要保留的小数点个数
bc -q
69/5
13
scale=5
45/4
11.25000
# -q命令行选项,可以不显示冗长欢迎信息
# bash计算器支持变量
bc -q
var1=10
var1 * 4
40
var2 = var1 / 5
print var2
2
quit
# 变量一旦定义,可以在整个bash计算器使用
# print 允许打印变量和数字
2)在脚本中使用bc
variable=$(echo "options;expression" | bc)
# 命令替换命令$(...),括号中命令的输出赋给变量
# options 允许设置变量,需要不止一个变量可用分号分开
# expression参数定义了通过bc执行的数学表达式
# 脚本文件file2
#!/bin/bash
var1=$(echo "scale=4;3.44/5" | bc)
echo The answer is $var1
# 在命令交互界面执行
chmod u+x file2
./file2
# 结果得到:The answer is .6880
#!/bin/bash
var1=100
var2=45
var3=$(echo "scale=4; $var1/$var2" | bc)
echo The answer for this is $var3
# 执行上述脚本文件file3
./file3
# 得到结果: The answer for this is 2.222
#!/bin/bash
var1=20
var2=3.14159
var3=$(echo "scale=4; $var1 * $var1" | bc)
var4=$(echo "scale=4; $var3 * $var2" | bc)
echo The final result is $var4
bc命令能识别输入重定向(见:Linux bash 基本命令 重定向输入输出 管道连接_想喝奶茶啾啾的博客-CSDN博客)但是仍比较麻烦,最好使用内敛输入重定向:
variable=$(bc << EOF
options
statements
expressions
EOF
)
# EOF文本字符串标识了内联重定向数据的起止
# 使用命令替换符号将bc命令的输出赋给变量
在脚本中使用:
#!/bin/bash
var1=10.46
var2=43.67
var3=33.2
var4=71
var5=$(bc << EOF
scale = 4
a1 = ( $var1 * $var2)
b1 = ($var3 * $var4)
a1 + b1
EOF
)
echo The final answer for this mess is $var5
4、退出脚本
shell中运行的每个命令都使用退出状态码(exit status)告诉shell它已经运行完毕。退出状态
码是一个0~255的整数值,在命令结束运行时由命令传给shell,可以捕获这个值并在脚本中使用。
Linux提供了一个专门的变量$?来保存上个已执行命令的退出状态码。对于需要进行检查的
命令,必须在其运行完毕后立刻查看或使用$?变量。
$ date
Sat Jan 15 10:01:30 EDT 2014
$ echo $?
0
$
一个成功结束的命令的退出状态码是0,如果一个命令结束时有错误,退出状态码就是一个正数值。
状态码 | 描述 |
0 | 命令成功结束 |
1 | 一般性未知错误 |
2 | 不适合的shell命令 |
126 | 命令不可执行 |
127 | 没找到命令 |
128 | 无效的退出参数 |
128+x | 与Linux信号x相关的严重错误 |
130 | 通过Ctrl+C终止的命令 |
255 | 正常范围之外的退出状态码 |
# 默认成功完成的退出状态码是0,exit命令允许在脚本结束时指定一个退出状态码。
#!/bin/bash
# testing the exit status
var1=10
var2=30
var3=$[$var1 + $var2]
echo The answer is $var3
exit 5
# 执行上述脚本文件file4
chmod u+x test13
./test13
# 得到结果:The answer is 40
# 查看状态码
echo $?
5
# 也可以在exit命令的参数中使用变量
#!/bin/bash
# testing the exit status
var1=10
var2=30
var3=$[$var1 + $var2]
exit $var3
# 执行上述脚本文件file5
chmod u+x test14
./test14
echo $?
40
# 注意退出状态码最大只能是255
#!/bin/bash
# testing the exit status
var1=10
var2=30
var3=$[$var1 * $var2]
echo The value is $var3
exit $var3
# 运行上述脚本文件file6
./test14b
# 得到结果:The value is 300
echo $?
44
# 状态码不是300,因为超过255(0-255),由300除以256,得到余数44。