• (四)Shell编程之算数运算


    一、shell算数运算表达式

    shell允许计算算数表达式,但是不能直接使用,需要使用算数展开 $(( exoression )),或者使用((符合命令、let或declare的-i选项。))计算是在固定宽度的整数中进行的,不检查溢出,尽管被0除会被捕捉并标记为错误

    二、算数运算符

    shell中常见的算数运算符如下:

    算数/逻辑/比较运算符说明/含义
    +、-                加法(或正号)、减法(或负号)
    *、/、%惩罚、除法、取余(取模)
    **幂运算
    ++、--自增和自减
    !、&&、||逻辑非(取反)、逻辑与(and)、逻辑或(or)
    <、<=、>、>=比较符号(小于、小于等于、大于、大于等于)
    ==、!=、=比较符号(相等、不相等;对于字符串,=可以表示相等于)
    <<、>>向左移位、向右移位
    ~、|、&、^        

    按位取反、按位或、按位与、按位异或

    =、+=、-=、*=、/=、%=赋值运算符,例如 a+=1相当于a=a+1,a-=1相当于a=a-1

    Shell变量允许作为操作数;在计算表达式之前执行参数展开。在表达式中,shell变量也可以通过名称引用,二不适用参数展开语法(可以不带$符号,但是不推荐)。当不使用参数展开语法而按名称引用为空或未设置的shell变量时,其计算结果为0.当一个变量被引用时,它的值将被作为一个算数表达式计算,或者当一个变量使用“declare -i”被赋值给一个整数属性时,它的值将被赋值。空值的计算结果为0.

    三、算数运算命令

    Bash shell在默认情况下不会区分变量类型,即使你将整数和小数赋值给变量,他们也会被视为字符串,这一点和大部分的编程语言不同。要想让数字计算发挥作用,必须使用数学计算命令。Shell中常用的数学计算命令如下表所示。

    运算操作符/运算命令说明
    (())用于整数运算,效率很高,推荐使用
    let用于整数运算,和(())类似
    $[]用于整数运算,不如(())灵活
    expr可用于整数运算,也可以处理字符串。比较麻烦,需要注意各种细节,不推荐使用
    bcLinux下的一个计算器程序,可以处理整数和小数。Shell本身值支持整数运算,想计算小数就得使用bc这个外部的计算器。
    declare -i将变量定义为整数,然后在进行数学运算时就不会被当成字符串了。功能有限,仅支持最基本的数学运算(加减乘除和取余),不支持逻辑运算、自增自减,所以在实际开发者很少使用。

    (1)(( ))

    (( expression )) 

    计算算数表达式,如果表达式的值非零,则返回状态为0;否则返回状态为1.完全等价于 let "expression"

    1. # 整数运算
    2. ((1+1))
    3. # echo $? 上一条语句的结果
    4. echo $?
    5. # 执行结果为0,因为1+1不等于0,所以 ((1+1))这条语句的返回状态为0
    6. 0


    表达式也可以有多个,有多个表达式时用逗号隔开 ((exp1,exp2))当执行多个表达式时,根据最后一个表达式的值来判断(())命令的执行状态。


    可以使用 $ 来获取 (()) 执行的算数表达式的结果:

    1. # 查看1+1等于几
    2. echo $((1+1))
    3. # 查看2的三次方等于几
    4. echo $((2**3))
    5. # 执行结果
    6. 2
    7. 8


    也可以用比较运算符:

    1. # 比较运算符
    2. a=1
    3. b=2
    4. echo $((a
    5. echo $((a>b))
    6. # 执行结果
    7. # 布尔值true返回1,false返回0
    8. 1
    9. 0


    也可以这么玩,类似于三元表达式:a

    1. # a
    2. a=1
    3. b=2
    4. ((a
    5. # 执行结果
    6. 2
    7. 2

     (2)let

    let内建函数允许对shell变量执行算数运算。如果最后一个表达式的计算结果为0,let返回1;否则返回0。

    命令格式如下:

    let expression [expression ...]

    (()) 不同的是,let 使用空格来分隔多个表达式。并且对于 x+y 这样的表达式,let 只会计算但不会保存结果,可以通过 let var=x+y 的方式将 x+y 的结果保存到变量 var 中。

    后面的不常用,大家就自行扩展叭~ 

    四、条件结构

    shell中也有流程控制条件分支语句,格式与python有点类似。

    语法如下:

    (1)if-then-fi(单分支)

    (2)if-then-else-fi(二分支)

    (3)if-then-elif-else-fi(多分支)

    五、条件运算 

    在shell中可以通过 test,或者 [[]] 关键字来检查某个条件是否成立。通常与if语句一起使用。

    test命令有很多选项,可以进行数值、字符串和文件三个方面的检测。

    Shell test 命令的格式为:

    test expression

    当test判断expression成立时,退出状态为0,否则为1。

    test命令也可以简写为 [],它的格式为:

    [ expression ]

    注意 [] expression之间的空格,这两个空格是必须的,否则会导致语法错误。 []的写法更加简洁,比 test 使用频率高。

    test 和 []是等价的。

    使用 test命令进行数值比较的案例:

    六、文件检测选项

    (1)文件类型的判断

    我们演示一个,其他的就不演示啦~ 

    (2)文件权限的判断

    (3)文件比较

    (4)数值比较


     

    (5)字符串比较

      我们举个栗子,其他的童鞋们自己去练练哈。

     

    TODO:在Shell中,他们只能用来比较字符串,不能比较数字,有C语言,Python、Java等变成经验的小伙伴们要注意了!!! 

    (6)逻辑运算

     

    七、在test中使用变量建议用双引号包围起来

    test 和 [ ] 都是命令,一个命令本质上对应一个程序或者一个函数。即使是一个程序,它也有入口函数,例如C语言程序的入口函数是main(),运行C语言程序就从main()函数开始,所以也可以将一个程序等效为一个函数,这样我们就不用再区分函数和程序了,直接将一个命令和一个函数对应起来即可。

    有了以上认知,就很容易看透命令的本质了:使用一个命令其实就是调用一个函数,命令后面附带的选项和参数最终都会作为实参传递给函数。

    假设test命令对应的函数是func(),使用 test -z $str1 命令时,会先将变量 $str1 替换成字符串:

     

     

      

     

     

     

     

  • 相关阅读:
    动态加权平衡损失:深度神经网络的类不平衡学习和置信度校准
    污水处理厂3D数字孪生三维可视系统降低设备风险隐患
    聚观早报 | 羊了个羊幕后推手月流水曾破亿;雷军卸任小米董事长
    Nginx之静态文件服务器的搭建
    【防作弊】Unity防本地调时间作弊
    从20s优化到500ms,我用了这三招
    为什么开源大模型终将胜出?
    IO流的字符流+对象流+打印流+内存流+随机访问流(2)
    activiti-image-generator
    C++面向对象编程(3)——常用关键字介绍(TODO)
  • 原文地址:https://blog.csdn.net/Sean_0819/article/details/126843561