|
2#
楼主 |
发表于 2018-4-25 15:09:11
|
只看该作者
wsx@wsx-ubuntu:~/script_learn$ exrpr 1 + 5
未找到 'exrpr' 命令,您要输入的是否是:
命令 'expr' 来自于包 'coreutils' (main)
exrpr:未找到命令
看到没有,那算了。它基本涉及的操作跟我们使用的其他语言是一致的。但是有些问题需要处理,像*是通
配符,在运算是是做乘号处理的,需要进行转义。
使用方括号
bash shell提供了一种更简单的方法来执行数学表达式。在bash中,在将一个数学运算结果赋给某个变量时,
可以用美元符和方括号($[operator])将数学表达式围起来。
wsx@wsx-ubuntu:~/script_learn$ var1=$[1+5]
wsx@wsx-ubuntu:~/script_learn$ echo $var1
6
wsx@wsx-ubuntu:~/script_learn$ var2=$[$var1+2]
wsx@wsx-ubuntu:~/script_learn$ echo $var2
8
这种方式不仅方便,而且因为在方括号内,不会让shell误解乘号或其他符号。
但bash shell计算有一个主要限制:它只支持整数运算!
浮点解决方案
最常见的方案是用内建的bash计算器。它实际上是一门编程语言,它允许在命令行中输入浮点表达式,然后
解释并计算该表达式,最后返回结果。bash计算器能够识别:
数字(整数和浮点数)
变量(简单变量和数组)
注释(/* */开始的行)
表达式
编程语句
函数
wsx@wsx-ubuntu:~/script_learn$ 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'.
12 * 5.4
64.8
3.156 * (3 + 5)
25.248
quit
在脚本中使用bc
可以用命令替换运行bc命令,并将输出赋给一个变量。基本格式如下:
variable=$(echo "options; expression" | bc)
options设置变量,expression参数定义了通过bc执行的数学表达式。
看一个简单实例:
wsx@wsx-ubuntu:~/script_learn$ cat test9
#!/bin/bash
var1=$(echo "scale=4; 3.44/5" | bc)
echo The answer is $var1
wsx@wsx-ubuntu:~/script_learn$ chmod u+x test9
wsx@wsx-ubuntu:~/script_learn$ ./test9
The answer is .6880
这个例子将scale变量设置为四位小数,并在expression部分指定了特定的运算。
这个方法适用于较短的运算,但有时我们会涉及更多的数字。如果需要进行大量运算,在一个命令行中列出
多个表达式就会有点麻烦。
这里有一个解决方法:使用内联输入重定向,将一个文件重定向到bc命令来处理。格式为:
variable=$(bc << EOF
options
statements
expressions
EOF)
EOF文本字符串标识了内联重定向数据的起始。注意,仍然需要命令替换符号将bc命令的输出赋给变量。
下面是一个例子:
wsx@wsx-ubuntu:~/script_learn$ cat test10
#!/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
wsx@wsx-ubuntu:~/script_learn$ chmod u+x test10
wsx@wsx-ubuntu:~/script_learn$ ./test10
The final answer for this mess is 2813.9882
在普通的shell脚本中,数字默认当做字符串处理。这也是为什么我们脚本处理计算麻烦和我们需要特定的工具
和方法来进行处理。一定要注意区分。
退出脚本
前面运行的脚本都是命令执行完成,脚本自动结束。其实我们可以用更为优雅的方式告诉shell命令运行完成,
因为每个命令都使用退出状态码(exit status),它是一个0-255的整数值,我们可以捕获这个值并在脚本中使用。
Linux提供了一个专门的变量$?来保存上个已执行命令的退出状态码。
wsx@wsx-ubuntu:~/script_learn$ date
2017年 07月 27日 星期四 10:44:18 CST
wsx@wsx-ubuntu:~/script_learn$ echo $?
0
按照惯例,一个成功结束的命令的退出状态码是0。如果有错误,则显示一个正数值。
Linux错误退出状态码没有什么标准,但有一些参考:
状态码 描述
0 命令成功结束
1 一般性未知错误
2 不适合的shell命令
126 命令不可执行
127 没找到命令
128 无效的退出参数
128+x 与Linux信号x相关的严重错误
130 通过Ctrl+C终止的命令
255 正常范围之外的退出状态码
wsx@wsx-ubuntu:~/script_learn$ asfg
未找到 'asfg' 命令,您要输入的是否是:
命令 'asdfg' 来自于包 'aoeui' (universe)
asfg:未找到命令
wsx@wsx-ubuntu:~/script_learn$ echo $?
127
exit命令
默认,shell脚本会以脚本最后的一个命令的退出状态码退出。
但是我们可以改变这种默认行为,返回自己的退出状态码。exit命令允许在脚本结束时指定一个状态退出码。
wsx@wsx-ubuntu:~/script_learn$ cat test13
#!/bin/bash
# testing the exit status
var1=10
var2=30
var3=$[$var1 + $var2]
echo The answer is $var3
exit 5
wsx@wsx-ubuntu:~/script_learn$ chmod u+x test13
wsx@wsx-ubuntu:~/script_learn$ ./test13
The answer is 40
wsx@wsx-ubuntu:~/script_learn$ echo $?
5
注意最大255,如果大于它,得到的是求模的结果(余数)。 |
|