【shell】shell编程(二)-运算符
上篇我们学会了如何使用及定义变量。按照尿性,一般接下来就该学基本数据类型的运算了。
没错,本篇就仍是这么俗套的来讲讲这无聊但又必学的基本数据类型的运算了。
基本数据类型运算
操作符
符号 | 语义 | 描述 |
---|---|---|
+ | 加 | 10+10,结果为20 |
- | 减 | 10-3, 结果为7 |
* | 乘 | 10*2,结果为20 |
/ | 除 | 10/3, 结果为3(取整数) |
% | 求余 | 10%3, 结果为1 (取余数) |
== | 判断是否相等 | 两数相等返回1,否则0 |
!= | 判断是否不等 | 两数不等返回1,否则0 |
> | 大于 | 前者大于后者返回1,否则0 |
>= | 大于或等于 | 前者大于或等于后者返回1,否则0 |
< | 小于 | 前者小于后者返回1,否则0 |
<= | 小于或等于 | 前者小于或等于后者返回1,否则0 |
上述操作符与其它语言相比,并无特殊之处。
注意:
条件表达式要放在方括号之间,并且要有空格,例如: [$a==$b] 是错误的,必须写成 [ $a == $b ]
在shell中,对于基本数据类型的运算主要分为两种,整数运算和浮点数(小数)运算。下面就分别来看看这两种运算:
整数运算
在shell中,有两种方式能实现整数运算,一种是使用expr命令, 另外一种是通过方括号($[])来实现。下面分别来看看:
expr
#!/bin/bash
#输出13
expr + #输出10+
expr + #输出7
expr - #输出30
expr \* #输出3
expr / #输出1
expr % #将计算结果赋值给变量
num1=$(expr % ) #将计算结果赋值给变量
num2=`expr % `
补充:(大于小于比较加转义,否则会将<做为重定向符号)
aaarticlea/png;base64,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" alt="" />
注意:
在以上的乘法(*)中,我们用了反斜线()来转义,不然会报错。
运算符前后必须还有空格,否则会被直接当作字符串返回。
如果要将计算结果保存到变量,就需要用到我们上篇文章讲到的那两种方式($() 或者 ``)来替换命令了。
这种种迹象无不让人吐槽啊。幸好还有一种实现方式,那就是接下来要看的方括号。
方括号($[])
#!/bin/bash
num1=
num2=
#输出num1 + num2=
echo "num1 + num2=$[$num1 + $num2]" #输出num1+num2=
echo "num1+num2=$[$num1+$num2]" #输出num1 - num2=
echo "num1 - num2=$[$num1 - $num2]" #输出num1 * num2=
echo "num1 * num2=$[$num1 * $num2]" #输出num1 > num2=
echo "num1 > num2=$[$num1 > $num2]" #输出num1 < num2=
echo "num1 < num2=$[$num1 < $num2]" #将运算结果赋值给变量,输出num3=
num3=$[$num1 / $num2]
echo "num3=$num3"
看了这种运算,再回看expr, 是不是觉得要升天,终于正常了。expr的那几个注意事项,在这儿都不算事儿。所以,如果要图简单,还是用这种方式吧。
浮点运算
在shell中,做浮点运算一般是用bash的计算器(bc)。在shell脚本中,一般我们的使用方法是:
variable=$(echo "options; expression" | bc)
options是bc的一些选项,例如: 可以通过scale去设置保留的小数位数。具体有哪些参数,可以man bc进行查看
expression就是我们具体的表达式,例如 10 * 3
" | " 这个符号,对于熟悉linux系统的人来说,这个再熟悉不过了。它叫做管道, 之所以会叫做管道,其实很形象,你可以把它看作一根水管,水管一头接入前一个命令的返回结果, 一头接入下一个命令。表示将前一个命令的执行结果作为后一个命令的参数输入。以上,表示将我们的表达式作为bc的参数输入。
#!/bin/bash
#表示 10/3, 保留2位小数,将结果赋值给了num, 输出3.33
num=$(echo "scale=2; 10 / 3" | bc)
echo $num
aaarticlea/png;base64,iVBORw0KGgoAAAANSUhEUgAAAhAAAAAmCAIAAAAa3jVHAAAFW0lEQVR4nO2d25mjMAxG0w+tUAqNUAh9pI5pYYvYfUgAXyRbsp2Q7Jzz+WUIyDLY+rEMzO1PwM/Pzw0AAEAEwQAAABMIBgAAmEAwAADABIIBAAAmEAwAADCBYAAAgAkEAwAATCAYAABgAsEAAAATCAYAAJiQBWNatvvBtkyXunh69BGetDHOf82Sd/sYMuvzOqbnjLJjsX9f5+H2FaZlG1zdvOqn5zGOW6ob6Oe8Pq/g+LbfXt9PXsW81k5F8bxNyxa11ntu57XxfOmC8b5BtBPIVNYUe9iLxG5EI+Y1MxTWYatC9t9vZ4xgKPWeg8983tTrMi2buUNq9f6tlRHMq9DcfTzWh7WToUGz2NXbxeI4+hsEY8fT31QDDXFDqrc+jsJ4r0neSwXjOMZ7zl4kGNWhTqEMKd2IgvEUinRY9jM+EMszjCPaNDLQzzOYzOtrp7p9gjHP02mqbiuI81nofm5QfYruQ6ZpOjcH+xfP2wjBaDpsuGBcHkEov630IQnGc4S+YKI9LhDv0UgSjO7o+QsFI7FVa/we5lNljrtTcfoq1vtewfCfN6tgTMt2v18eGiiUvPSFiWRMR2sbxgxFkM2I9oyyHFF64fwlOMCZoHyaEgRDCwLX+KkRnek8+qU/xRulKCxF1SY/M1sPQ9pkIfwhOVTxyqIXVRclwThaXD+fLbXezIJxeVCgULRSGVjpKEnWJfKbwL33226Iw3u7MHqUV60eBwTHRrtbE0qPmJvtqd3XXuan4roYxdW1uCNlJFYrB/msvdL9gDC/FNcsLYIh6EdiS1gWEzppDVEwDgv165u0wK6nFsG4PCJQKFopDrFjWAWjJh1q+XhxLWDEEeI0psTSZPge+wt3prZRHEcK/eCr/axUoPhZODZfBZaXjGP/TX55NNApGKVO5VmErqSkYoUs2/SpPoJB+d5SCwHx4qJ8HxfFknjyLs/hI4QDik8ECQN7nW+1VHiBadnWWYhaQjy91E/N+eQmv6RA8eygLBhae+v+OGdMvpRU5ak7e+y2CoZB0ZlhUH5d8RIcmI6XICFlGUbaGC/duQuBuGeGsc5J9kyKe1f7WW5CPcuVZVlcM4xos5aSanrGwbPoXZ2z2gWrLBjBX1UNYg2D8vYijLK0H6YpZSX1fu9xw0hyVCIY3idqhdd0zgbL6WopoLjXBuZlz7A9Zhip6EmKcYWfRe9T66o/0T5SU7Ima+3VKAVO+xpGZCdX12ro7kpJ7c2NLp5yPgV3TbieklJq1Z6aUJ+miOaLca9Up4/JmJByB+ccLL9/UPfPf6yvIQb7R5el1OmliZ9qZ101XxRLvu1Cvaar+IhMtpxE3hFPQ1GE0+p9kWbkh2RPSW2L84larf8kne6pQ+odqDpe6pWKfVZdyX6rnzLxnb7w4E7iT7UfSoGvMq4L+96lMZDrUUKoo7kRbcoaWvJ0OUGmFjluiOfz/MV1DT/pTW/oyjl6t1+J36fOOVDByAeeHgePlJT8Q0dAh5juiGiesb7P3NzyeZBv+ZbUb6EuGM5kdPc7v6M4X2jtznyPzaf9x2EV0RhDw2J4gnFFzEyvYDSJxe3G12o/jeJTK+pk2b79OobfhAxRCwBwgGDAt4NaALwJQTDCRRj766b5/l47AK2gFgDvQBAM7euJGurXFp12APpALQBeSzEl5V3r0fbvXzMCaAe1ABhDSTDQCwAAOBAFQ/nqjoq2v9cOAAB8LrUZhvOTu65/HgoAAF9E+bFa72r1p788BgAAzZQFg1UMAAB44ktJFb7aKO5f3g4AAF9E5cU98d+wCP+BRvk644d9nQIAANrh0yAAAGACwQAAAAv/AFjXu9NdWqllAAAAAElFTkSuQmCC" alt="" />
布尔运算符(一个运算符)
下表列出了常用的布尔运算符,假定变量 a 为 10,变量 b 为 20:
运算符 | 说明 | 举例 |
---|---|---|
! | 非运算,表达式为 true 则返回 false,否则返回 true。 | [ ! false ] 返回 true。 |
-o | 或运算,有一个表达式为 true 则返回 true。 | [ $a -lt 20 -o $b -gt 100 ] 返回 true。 |
-a | 与运算,两个表达式都为 true 才返回 true。 | [ $a -lt 20 -a $b -gt 100 ] 返回 false。 |
逻辑运算符(两个尖括号)
以下介绍 Shell 的逻辑运算符,假定变量 a 为 10,变量 b 为 20:
运算符 | 说明 | 举例 |
---|---|---|
&& | 逻辑的 AND | [[ $a -lt 100 && $b -gt 100 ]] 返回 false |
|| | 逻辑的 OR | [[ $a -lt 100 || $b -gt 100 ]] 返回 true |
字符串运算符(一个尖括号)
下表列出了常用的字符串运算符,假定变量 a 为 "abc",变量 b 为 "efg":
运算符 | 说明 | 举例 |
---|---|---|
= | 检测两个字符串是否相等,相等返回 true。 | [ $a = $b ] 返回 false。 |
!= | 检测两个字符串是否相等,不相等返回 true。 | [ $a != $b ] 返回 true。 |
-z | 检测字符串长度是否为0,为0返回 true。 | [ -z $a ] 返回 false。 |
-n | 检测字符串长度是否为0,不为0返回 true。 | [ -n $a ] 返回 true。 |
str | 检测字符串是否为空,不为空返回 true。 | [ $a ] 返回 true。 |
文件测试运算符(一个尖括号)
文件测试运算符用于检测 Unix 文件的各种属性。
属性检测描述如下:
操作符 | 说明 | 举例 |
---|---|---|
-b file | 检测文件是否是块设备文件,如果是,则返回 true。 | [ -b $file ] 返回 false。 |
-c file | 检测文件是否是字符设备文件,如果是,则返回 true。 | [ -c $file ] 返回 false。 |
-d file | 检测文件是否是目录,如果是,则返回 true。 | [ -d $file ] 返回 false。 |
-f file | 检测文件是否是普通文件(既不是目录,也不是设备文件),如果是,则返回 true。 | [ -f $file ] 返回 true。 |
-g file | 检测文件是否设置了 SGID 位,如果是,则返回 true。 | [ -g $file ] 返回 false。 |
-k file | 检测文件是否设置了粘着位(Sticky Bit),如果是,则返回 true。 | [ -k $file ] 返回 false。 |
-p file | 检测文件是否是有名管道,如果是,则返回 true。 | [ -p $file ] 返回 false。 |
-u file | 检测文件是否设置了 SUID 位,如果是,则返回 true。 | [ -u $file ] 返回 false。 |
-r file | 检测文件是否可读,如果是,则返回 true。 | [ -r $file ] 返回 true。 |
-w file | 检测文件是否可写,如果是,则返回 true。 | [ -w $file ] 返回 true。 |
-x file | 检测文件是否可执行,如果是,则返回 true。 | [ -x $file ] 返回 true。 |
-s file | 检测文件是否为空(文件大小是否大于0),不为空返回 true。 | [ -s $file ] 返回 true。 |
-e file | 检测文件(包括目录)是否存在,如果是,则返回 true。 | [ -e $file ] 返回 true。 |
(1)EQ 就是 EQUAL等于
NE 就是 NOT EQUAL不等于
GT 就是 GREATER THAN大于
LT 就是 LESS THAN小于
GE 就是 GREATER THAN OR EQUAL 大于等于
LE 就是 LESS THAN OR EQUAL 小于等于
(2)使用 [[ ... ]] 条件判断结构,而不是 [ ... ],能够防止脚本中的许多逻辑错误。比如,&&、||、< 和 > 操作符能够正常存在于 [[ ]] 条件判断结构中,但是如果出现在 [ ] 结构中的话,会报错。
也就是逻辑运算符用两个尖括号,其他普通的比较用一个括号就可以
小结
本篇比较无聊,简单介绍了shell的基本运算符及其运算。shell运算主要分为整型和浮点型的运算。整型又有两种实现方式,浮点型是通过使用bash内置的计算器(bc)来实现的。
好啦,到此,我们学习了shell的变量的使用,也学习了基本数据类型变量的计算啦!挺简单吧
接下来可以学习shell编程三:http://www.cnblogs.com/qlqwjy/p/7745983.html
【shell】shell编程(二)-运算符的更多相关文章
- Linux shell脚本编程(二)
Linux shell脚本编程(二) 练习:求100以内所有偶数之和; 使用至少三种方法实现; 示例1: #!/bin/bash # declare -i sum=0 #声明一个变量求和,初始值为0 ...
- Linux学习——shell编程之运算符
shell编程之运算符 一:shell中常见算术运算符号和优先级 二:算术运算符 Shell 变量:是弱类型!不能进行加减乘除!比较麻烦! 例子 :shell变量弱类型 a=11 b=22 echo ...
- (C#)Windows Shell 外壳编程系列4 - 上下文菜单(iContextMenu)(二)嵌入菜单和执行命令
(本系列文章由柠檬的(lc_mtt)原创,转载请注明出处,谢谢-) 接上一节:(C#)Windows Shell 外壳编程系列3 - 上下文菜单(iContextMenu)(一)右键菜单 上一节说到如 ...
- Shell脚本编程总结及速查手册
Shell是一种编程语言, 它像其它编程语言如: C, Java, Python等一样也有变量/函数/运算符/if语句/循环控制/… 但在开始之前, 我想先理清Shell语言与Shell之间的关系. ...
- Shell脚本编程具体解释
第12章 Shell脚本编程 l Shell命令行的执行 l 编写.改动权限和运行Shell程序的步骤 l 在Shell程序中使用參数和变量 l 表达式比較.循环结构语句和条件结构语句 l ...
- Shell学习笔记二
一.调试脚本 调试功能是每一种编程语言都应该实现的重要特性之一,当出现一些始料未及的情况时,用它来生成脚本运行信息.调试信息可以帮你弄清楚是什么原因使得程序发生崩溃或行为异常.每位系统程序员都应该了解 ...
- SHELL脚本编程的常识和VI常用技巧
来源:http://mprc.pku.edu.cn/mentors/training/TrainingCourses/material/ShellProgramming.HTM#_Toc3751808 ...
- Linux shell脚本编程基础之练习篇
shell脚本编程基础之练习篇. 1.编写一个脚本使我们在写一个脚本时自动生成”#!/bin/bash”这一行和注释信息. #!/bin/bash ] then echo "请输入一个参数& ...
- shell脚本编程基础
最近学习了shell脚本编程,感觉自己的脚本写的不太好,所以想把shell脚本相关的知识系统的整理一下,便于以后的学习和使用. 一.shell脚本基础 shell脚本是利用shell的功能 ...
- shell脚本(二)
shell脚本(二)——变量 一.定义:用来存放各种数据,编程语言组成部分 变量的命名规则: 变量名由数字 字母下划线组成 必须以字母或者下划线开头 不能使用shell里面的关键词 ...
随机推荐
- JS与JQ 获取页面元素值的方法和差异对比
获取浏览器高度和宽度 document.documentElement.clientWidth ==> 浏览器可见区域宽度 document.documentElement.clientHeig ...
- Android 使用 adb命令 远程安装apk
Android 使用 adb命令 远程安装apk ./adb devices 列出所有设备 ./adb connect 192.168.1.89 连接到该设备 ./adb logcat 启动logca ...
- easyui树节点拖拽排序的存储过程
easyui树的拖拽排序功能 easyui树中有拖拽功能 树结构如下: 一个行政区域对应一个单位,一个单位对应多个部门,每个部门下有相关人员,功能要求: (1)行政区域没有子节点,点击text加载部门 ...
- shell脚本,每5个字符之间插入"|",行末不插入“|”。
文本aaaaabbbbbcccccdddd eeeeefffffkkkkkvvvv nnnnnggggg 希望得到的结果如下: aaaaa|bbbbb|ccccc|dddd eeeee|fffff|k ...
- java第十次作业:oop的第6张图片到第11张图片
- 关于HTML设置访问密码。
如果你要设置访问密码恐怕要使用sublime_text了 废话不多,开始!!! 先把这些东西加上: <html> <script> 然后开始写代码: 先辨别密码登录正确的情况: ...
- LeetCode 最长连续递增序列
给定一个未经排序的整数数组,找到最长且连续的的递增序列. 示例 1: 输入: [1,3,5,4,7] 输出: 3 解释: 最长连续递增序列是 [1,3,5], 长度为3. 尽管 [1,3,5,7] 也 ...
- perl学习之子例程
1.system function && user function system fucntion:chomp reverse print... user function: & ...
- python--管道, 事件, 信号量, 进程池
一 . 管道 (了解) from multiprocessing import Process, Pipe def f1(conn): # 管道的recv 里面不用写数字 from_main_proc ...
- I2C驱动框架(五)
参考:I2C子系统之 adapter driver注册——I2C_dev_init() i2c的操作在内核中是当做字符设备来操作的,相关初始化在由i2c_dev_init函数来初始化. static ...