SHELL脚本编程的运算符

                             作者:尹正杰

版权声明:原创作品,谢绝转载!否则将追究法律责任。

 

一.算数运算
1>.bash中的算数运算
  1. [root@node101.yinzhengjie.org.cn ~]# help let
  2. let: let arg [arg ...]
  3. Evaluate arithmetic expressions.
  4.  
  5. Evaluate each ARG as an arithmetic expression. Evaluation is done in
  6. fixed-width integers with no check for overflow, though division by
  7. is trapped and flagged as an error. The following list of operators is
  8. grouped into levels of equal-precedence operators. The levels are listed
  9. in order of decreasing precedence.
  10.  
  11. id++, id-- variable post-increment, post-decrement
  12. ++id, --id variable pre-increment, pre-decrement
  13. -, + unary minus, plus
  14. !, ~ logical and bitwise negation
  15. ** exponentiation
  16. *, /, % multiplication, division, remainder
  17. +, - addition, subtraction
  18. <<, >> left and right bitwise shifts
  19. <=, >=, <, > comparison
  20. ==, != equality, inequality
  21. & bitwise AND
  22. ^ bitwise XOR
  23. | bitwise OR
  24. && logical AND
  25. || logical OR
  26. expr ? expr : expr
  27. conditional operator
  28. =, *=, /=, %=,
  29. +=, -=, <<=, >>=,
  30. &=, ^=, |= assignment
  31.  
  32. Shell variables are allowed as operands. The name of the variable
  33. is replaced by its value (coerced to a fixed-width integer) within
  34. an expression. The variable need not have its integer attribute
  35. turned on to be used in an expression.
  36.  
  37. Operators are evaluated in order of precedence. Sub-expressions in
  38. parentheses are evaluated first and may override the precedence
  39. rules above.
  40.  
  41. Exit Status:
  42. If the last ARG evaluates to , let returns ; let returns otherwise.
  43. [root@node101.yinzhengjie.org.cn ~]#

[root@node101.yinzhengjie.org.cn ~]# help let

  1. +, -, *, /, %取模(取余), **(乘方),乘法符号有些场景中需要转义。
  2.  
  3. 实现算术运算:
  4.   () let var=算术表达式
  5.   () var=$[算术表达式]
  6.   () var=$((算术表达式))
  7.   () var=$(expr arg1 arg2 arg3 ...)
  8.   () declare i var = 数值
  9.   () echo ‘算术表达式’ | bc
  10.  
  11. 增强型赋值:
  12.   +=, -=, *=, /=, %=
  13.  
  14. let varOPERvalue
  15.   例如:let count+=
  16.   自加3后自赋值
  17.  
  18. 自增,自减:
  19.   let var+=
  20.   let var++
  21.   let var-=
  22.   let var--
  1. [root@node101.yinzhengjie.org.cn ~]# x=
  2. [root@node101.yinzhengjie.org.cn ~]# y=
  3. [root@node101.yinzhengjie.org.cn ~]#
  4. [root@node101.yinzhengjie.org.cn ~]# let num=$x*$y
  5. [root@node101.yinzhengjie.org.cn ~]# echo $num
  6. [root@node101.yinzhengjie.org.cn ~]#
  7. [root@node101.yinzhengjie.org.cn ~]# let num=x*y
  8. [root@node101.yinzhengjie.org.cn ~]# echo $num
  9. [root@node101.yinzhengjie.org.cn ~]#
  10. [root@node101.yinzhengjie.org.cn ~]# echo $[x-y]
  11. -
  12. [root@node101.yinzhengjie.org.cn ~]# echo $[x**y]
  13. [root@node101.yinzhengjie.org.cn ~]# echo $[y%x]
  14. [root@node101.yinzhengjie.org.cn ~]#
  15. [root@node101.yinzhengjie.org.cn ~]# i=
  16. [root@node101.yinzhengjie.org.cn ~]# echo $i
  17.  
  18. [root@node101.yinzhengjie.org.cn ~]# ((i++)) #等价于i=i+,表示要先使用i变量后,在对其进行加1操作。
  19. [root@node101.yinzhengjie.org.cn ~]#
  20. [root@node101.yinzhengjie.org.cn ~]# echo $i
  21.  
  22. [root@node101.yinzhengjie.org.cn ~]# unset i
  23. [root@node101.yinzhengjie.org.cn ~]#
  24. [root@node101.yinzhengjie.org.cn ~]# m=
  25. [root@node101.yinzhengjie.org.cn ~]# let ++m #在循环中使用会需要先对m变量进行加1在使用它。
  26. [root@node101.yinzhengjie.org.cn ~]# echo $m
  27.  
  28. [root@node101.yinzhengjie.org.cn ~]#
  29. [root@node101.yinzhengjie.org.cn ~]# echo $x
  30.  
  31. [root@node101.yinzhengjie.org.cn ~]# echo $y
  32.  
  33. [root@node101.yinzhengjie.org.cn ~]#
  34. [root@node101.yinzhengjie.org.cn ~]# expr $x \* $y
  35.  
  36. [root@node101.yinzhengjie.org.cn ~]#
  37. [root@node101.yinzhengjie.org.cn ~]# declare -i m=
  38. [root@node101.yinzhengjie.org.cn ~]# declare -i n=
  39. [root@node101.yinzhengjie.org.cn ~]# declare -i num=m+n
  40. [root@node101.yinzhengjie.org.cn ~]# echo $num
  41.  
  42. [root@node101.yinzhengjie.org.cn ~]#
  43. [root@node101.yinzhengjie.org.cn ~]# echo "100 * 2" | bc
  44.  
  45. [root@node101.yinzhengjie.org.cn ~]#
  46. [root@node101.yinzhengjie.org.cn ~]# x=
  47. [root@node101.yinzhengjie.org.cn ~]# let x+=
  48. [root@node101.yinzhengjie.org.cn ~]# echo $x
  49.  
  50. [root@node101.yinzhengjie.org.cn ~]# let x-=
  51. [root@node101.yinzhengjie.org.cn ~]# echo $x
  52.  
  53. [root@node101.yinzhengjie.org.cn ~]#
  54. [root@node101.yinzhengjie.org.cn ~]# let x/= #不支持浮点数,因此除等得到的值只能取整数。
  55. [root@node101.yinzhengjie.org.cn ~]# echo $x
  56.  
  57. [root@node101.yinzhengjie.org.cn ~]#

算术运算符测试案例

2>.bash有内建的随机生成器变量:"$RANDOM(0-32767)"
  1. [root@node101.yinzhengjie.org.cn ~]# man bash            #保存了BASH中默认存在的变量,RANDOM只是其中之一。
  2. [root@node101.yinzhengjie.org.cn ~]# echo $RANDOM
  3.  
  4. [root@node101.yinzhengjie.org.cn ~]#
  5. [root@node101.yinzhengjie.org.cn ~]# echo $RANDOM
  6.  
  7. [root@node101.yinzhengjie.org.cn ~]#
  8. [root@node101.yinzhengjie.org.cn ~]# echo $RANDOM #默认生成 - 之间随机数
  9.  
  10. [root@node101.yinzhengjie.org.cn ~]#
  11. [root@node101.yinzhengjie.org.cn ~]# echo $[$RANDOM%]     #生成 - 之间随机数
  12.  
  13. [root@node101.yinzhengjie.org.cn ~]#
  14. [root@node101.yinzhengjie.org.cn ~]# echo $[$RANDOM%]
  15.  
  16. [root@node101.yinzhengjie.org.cn ~]#
  17. [root@node101.yinzhengjie.org.cn ~]# echo $[$RANDOM%]
  18.  
  19. [root@node101.yinzhengjie.org.cn ~]#
3>.declare声明变量类型
4>.数值运算 
5>.expr或let数值运算工具
6>.“$((运算式))”或"$[运算式]"
7>.运算符
8>.小试牛刀
  1. ()编写脚本 sumid.sh,计算/etc/passwd文件中的第10个用户和第20用户的UID之和
  2. ()编写脚本 sumspace.sh,传递两个文件路径作为参数给脚本,计算这两个文件中所有空白行之和
  3. ()编写脚本 sumfile.sh,统计/etc, /var, /usr 目录中共有多少个一级子目录和文件
 
二.逻辑运算
1>.位与(&)
  1. 与运算只能是二进制的操作,任何数和0相与,结果为0,任何数和1相与,保留原值。
  2.  
  3. 举例,请将十进制的128进行与运算。
  4.   首先将128转换成二进制,如下所示:
  5.      ------> 0b0000
  6.      ------> 0b0000
  7.   得到的最终结果为:0b0000 ,即12&=。
2>.位或(|)
  1. 与运算只能是二进制的操作,两个数字只要有1,结果为1,两个书数字都为0,结果才为0
  2.  
  3. 举例,请将十进制的128进行或运算。
  4.   首先将128转换成二进制,如下所示:
  5.      ------> 0b0000
  6.      ------> 0b0000
  7.   得到的最终结果为:0b0000 ,即12|=。
3>.非(!)
  1. 非操作就是取反,如:
      !1 = 0,即1(true)的非为0(false)。
      !0 = 1,即0(false)的非为1(true)。
4>.短路运算
  1. 短路与(&&):
  2.   举例:我们将0表示为假,1表示为真,则有以下关系:
  3.     假与真=假(&&=)
  4.     假与假=假(&&=)
  5.     真与真=真(&&=)
  6.     真与假=假(&&=)
  7.   
  8.   总结:
  9.     CMD1 && CMD2
  10.     如果与前面的CMD1执行是假,结果必定是假,没有必要执行与后的操作CMD2。反之,则CMD2要参加运算。
  11.  
  12. 短路或(||):
  13.   举例:我们将0表示为假,1表示为真,则有以下关系:
  14.     真或真=真(||=)
  15.     真或假=真(||=)
  16.     假或真=真(||=)
  17.     假或假=假(||=)
  18.  
  19.   总结:
  20.     CMD1 || CMD2
  21.     如果或前面的CMD1执行结果是真,结果必定是真,没有必要执行或后的操作CMD2。反正,则CMD2要参与运算。
5>.异或(^)
  1.   举例:我们将0表示为假,1表示为真,则有以下关系:
  2.     假异或假=假(^=)
  3.     假异或真=真(^=)
  4.     真异或假=真(^=)
  5.     真异或真=假(^=)
  6.  
  7.   总结:
  8.     异或的两个值,相同为假,不同为真。
  9.  
  10.   小试牛刀:请将十进制的128进行异或运算。
  11.     首先将128转换成二进制,如下所示:
  12.        ------> 0b0000
  13.        ------> 0b0000
  14.     得到的最终结果为:0b0000 0,即12^=4。由此可迅速推断出4^8=12,4^12=8
  1. [root@node101.yinzhengjie.org.cn ~]# x=;y=;tmp=$x;x=$y;y=$tmp;echo x=$x,y=$y        #借助于中间变量
  2. x=,y=
  3. [root@node101.yinzhengjie.org.cn ~]#
  4. [root@node101.yinzhengjie.org.cn ~]# x=;y=;x=$[x^y];y=$[x^y];x=$[x^y];echo x=$x,y=$y    #借助于异或运算,效率更好,因为是基于二进制的。
  5. x=,y=
  6. [root@node101.yinzhengjie.org.cn ~]#

变量互换案例(将x=100,y=200变为y=100,x=200)

Bash基本功能的更多相关文章

  1. 鸟哥的私房菜:Bash shell(一)-Bash shell功能简介

    Bash shell系列里,由变量谈起,先讲到环境变量的功能与修改的问题, 然后会继续提到历史指令的运用.接下来,就会谈一下『数据流重导向』这个重要概念, 最后就是管线命令的利用! 一  Bash s ...

  2. 6.Bash的功能

    6.Bash的功能本章介绍 Bash 的特色功能.6.1 Bash的启动 bash [长选项] [-ir] [-abefhkmnptuvxdBCDHP] [-o 选项] [-O shopt 选项] [ ...

  3. Linux学习笔记(15)shell基础之Bash基本功能

    1 shell概述 shell是一个命令解释器,为用户提供了一个向Linux内核发送请求以便运行程序的界面系统级程序.用户可以用shell启动.挂起.停止甚至是编写一些程序. shell是一个功能强大 ...

  4. Linux系列教程(二十一)——Linux的bash基本功能

    上篇博客我们介绍了什么是shell,以及编写shell脚本的两种执行方式.我们知道在敲命令的时候,有很多快捷键,比如tab键能补全命令,在比如为什么我们直接敲 ll 命令能显示目录的长格式,其实这是b ...

  5. bash 基本功能

    1 shell概述 shell是一个命令解释器,为用户提供了一个向Linux内核发送请求以便运行程序的界面系统级程序.用户可以用shell启动.挂起.停止甚至是编写一些程序. shell是一个功能强大 ...

  6. 『忘了再学』Shell基础 — 4、Bash基本功能(history命令)

    目录 1.history历史命令 2.设置命令历史记录的条数 3.清空历史命令 4.历史命令的调用 5.命令与文件的补全 在Linux系统中默认的Shell就是Bourne-AgainShell(简称 ...

  7. linux笔记:shell基础-bash基本功能

    历史命令的调用: 命令和文件补全(如果当前有多个可选的补全,则按2次tab键,可以列出所有的可选项): 命令别名: 让别名永久生效: 删除别名: bash常用快捷键: 标准输入输出: 输出重定向: 输 ...

  8. Linux学习 -- Shell基础 -- Bash基本功能

    历史命令 history -c   clear -w   写入 ~/.bash_history 默认保存1000条, 可在/etc/profile中修改 调用 Tab补全 命令.目录.文件 命令别名 ...

  9. Shell基础 - Bash基础功能

    历史命令 history选项: -c 清空历史命令 -w 立即保存历史命令Linux 下输入过的历史命令,都会保存在根目录下的:~/root/.bash_history 文件中默认保存 1000 条, ...

随机推荐

  1. 20135337——Linux内核分析:第十七章 模块与设备

    第17章 模块与设备 设备类型:在所有 Unix 系统中为了统一普通设备的操作所采用的分类. 模块: Linux 内核中用于按需加载和卸载目标码的机制. 内核对象:内核数据结构中支持面向对象的简单操作 ...

  2. hover设定触发时间间隔

    500毫秒执行一次 $(".banner_menu_content li a").hover(function(){ var aa=$(this).text().trim(); s ...

  3. 关于QQ的NABCD模型

    关于QQ的NABCD模型 N--Need 随着电脑的普及,人们在网络上进行交流的时间越来越多,由于现有的交流工具还不是那么的完善,还不能够完全满足人们在交流时的需求.因此为了满足人们更多的需求,我们设 ...

  4. C++高质量编程笔记

    /* * 函数介绍: * 输入参数: * 输出参数: * 返回值 : */ void Function(float x, float y, float z) { - } if (-) { - whil ...

  5. [BUAA_SE_2017]个人项目-Sudoku

    个人项目作业-数独 Github项目地址 时间预估 PSP2.1 Personal Software Process Stages 预估时间(分钟) 实际耗时(分钟) Planning 计划 60 · ...

  6. [系统软件]Ubuntu 18.04中的Shutter禁用了“编辑”选项解决

    本文引用自linux公社, 原文请点击 : https://www.linuxidc.com/Linux/2018-04/151911.htm   在Ubuntu 18.04中安装了我最喜欢的截图工具 ...

  7. shell脚本--显示文本内容

    shell脚本显示文本内容及相关的常用命令有cat.more.less.head.tail.nl 首先是cat,cat最常用的就是一次性显示文件的所有内容,如果一个文件的内容很多的话,那么就不是很方便 ...

  8. 常用的查询DOM的方法

    查询body的方法=========== document.body // document.getElementsTagname("body")[0]; 查询html的方法=== ...

  9. hive桶表

    创建桶表,提高查询速度, 下免.tom'jerry'scott如果他们经过hash计算,得到的hash值一样,则放到桶一个表中. 创建桶表 指明桶的分桶条件,以sname分桶;分为5个桶

  10. Linux基础学习(3)--初学注意

    第三章——初学注意 一.学习Linux的注意事项 1.Linux严格区分大小写 2.Linux中所有内容以文件形式保存,包括硬件: (1)硬盘文件是/dev/sd[a-p] (2)光盘文件是/dev/ ...