- expr命令
最初,Bourne shell提供一种专有命令来计算数学等式.expr命令允许处理命令行中的灯饰,但是很笨拙:
expr 1+5
expr命令能够区分一些不同的数学操作符和字符串操作符
在脚本或命令行中使用标准操作符会出现问题,尽管在expr命令中他们可以正常运行.shell中许多expr命令操作符(如星号)有其他含义.在expr命令中使用他们会生成一些奇怪的结果
要解决此问题,在传送给expr命令的字符可能被错误解析前,需要使用shell转义字符(反斜杠)来识别它们:
- 使用括号( [ ] )
bash shell包含expr命令,使其与Bouneshell保持兼容.当为一个变量指定一个数学值时,可以 用美元符号和方括号($[operation])把数学等式括起来:
var1=$[1 + 5] echo $var1 # 6 var2=$[$var1 * 2] echo $var2 # 12
在bash shell脚本中计算数学等式有一个主要限制.
var1=100 var2=45 var3=$[$var1 / $var2] echo The final result is $var3 # The final result is 2
Bash shell 的数学操作只支持整数算法, 如果想做任何类型的实际的计算,这是一个很大的限制. Z shell (zsh)支持浮点算数运算,如果在shell脚本中需要浮点计算,可以考虑使用z shell
- 浮点解决方案
有几种克服bash整数限制的解决方案.最普遍的解决方法是使用内置的bash计算器(称为bc)
1) bc的基本知识
bash计算器实际上是一种编程语言,该语言允许在命令行中输入浮点表达式,然后解释 表达式并计算它们,最后返回结果.bash计算器可以识别: 数字(证书和浮点) , 变量(简单变量和数组) , 注释(以英镑符号开始的行或C语言的/* */对) , 表达式 , 编程语句 , 函数 .可以使用bc命令从shell提示符访问bash计算器.
在这个例子以输入表达式12*5.4开始, bash计算器返回结果.计算器对每一个后续键入的表达式都进行计算并显示结果.要退出bash计算器,必须输入quit
浮点算术被称为scale的内置变量控制.必须把这个值设置为想要的十进制小数位数,否则得不到想要的结果
scale变量的默认值是0.在设置scale值之前,bash计算器提供0小数位的答案.将scale变量值设为4之后,bash计算器显示为4位小数位的答案.-q命令行参数禁止bash计算器的荣誉欢迎标语
除了普通的数字,bash计算器也识别变量, 一旦定义了变量值,可以在整个bash计算器会话中使用该变量.print语句允许打印变量和数字
2) 在脚本中使用bc
使用 反引号字符 和 管道 可在脚本中使用bc
#!/bin/bash var1=`echo " scale=4; 3.44 / 5" | bc` echo The answer is $var1 # 输出: The answer is .6880
也可以使用在shell脚本中定义的变量
#!/bin/bash var1=100 var2=45 var3=`echo " scale=4; $var1 * $var2" | bc` var4=`echo "scale=4; $var3 * $var2" | bc` echo The final result is $var4 # 输出: The final result is 202500
在shell脚本中,可以把输出赋值给变量. 使用该技术,可以吧脚本中每个操作和表达式放在单独的行中,使其更加清晰并便于阅读. 在bash计算器内创建的变量只在bash计算器内有效,而不能用在shell脚本中
#!/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 # 输出: The final answer for this mess is 2813.9882
- 退出脚本
为了向shell表明,命令已经处理完毕,每条运行在shell中的命令都使用一个退出状态.这个退出状态时一个介于0好255之间的证书值,当命令运行完成时,命令就会把退出状态传递给shell.可以捕捉这个值并在您的脚本中使用它.
1) 核对退出状态
Linux提供 $? 特殊变量来保存最后一条命令执行结束的退出状态.如果想核对一条命令的退出状态,必须在这条命令运行完成之后立即查看或使用变量 $? . 它会改变为shell执行的最后一条命令的退出状态值
date # 输出: Sat Sep 29 10:01:00 EDT 2020 echo $? # 输出: 0
按照惯例,一条命令成功完成的退出状态是 0.如果命令执行错误, name退出状态就是一个正整数
asdfg # 输出: -bash: asdfg: command not found echo $? # 输出: 127
Linux退出状态码
2) 退出命令
默认情况下,shell脚本中最后一条命令的退出状态退出. 可以把它改为返回自己的退出状态码. exit命令允许在脚本结束时,指定一个退出状态
#!/bin/bash # testing the exit status var1=10 var2=30
var3=$[ $var1 + $var2 ]
echo The answer is $var3
exit 5
# 输出: The answer is 40
echo $?
# 显示: 5
应该谨慎使用这个功能,因为退出状态代码最高是255, 如果大于255, 退出状态码会进过计算自动降低到适合 0-255范围之内的数. 计算规则是: 用要返回的状态码和256求余(如300和256的余数是44, 44就是退出状态码)