加载中…
个人资料
  • 博客等级:
  • 博客积分:
  • 博客访问:
  • 关注人气:
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
正文 字体大小:

shell脚本快速入门之expr语法和算术运算

(2013-10-16 08:08:23)
标签:

功能

整数

操作数

除法

示例

分类: Linux基础

shell脚本之expr语法和算术运算

 

 

题记:感觉ksh和bash语法差不多,csh同C语言语法相似

 

 

二、expr

    语法:用来计算表达式的值

    注释:expr的每个参数之间必须用空格分隔,特殊字符需转义

    分类:

    1、逻辑表达求值

       1)ARG1 | ARG2

       注释:ARG1既不为空也不为0时,取ARG1的值,否则取ARG2的值

       示例:

            linux-mdcc:~ # expr 1 \| 2

            1

            linux-mdcc:~ # expr 1 \| 0

            1

            linux-mdcc:~ # expr 0 \| 2

            2

            linux-mdcc:~ # expr 0 \| 0

            0

 

       2)ARG1 & ARG2

       注释:ARG1并且ARG2既不为空也不为0时取ARG1的值,否则取值0

       示例:

            linux-mdcc:~ # expr 1 \& 2

            1

            linux-mdcc:~ # expr 0 \& 2

            0

            linux-mdcc:~ # expr 2 \& 0

            0

            linux-mdcc:~ # expr 0 \& 0

            0

 

       3)ARG1 < ARG2

       注释:ARG1 小于ARG2时为真,取值1

       示例:

            linux-mdcc:~ # expr 0 \< 1

            1

            linux-mdcc:~ # expr 0 \>= 1

            0

 

       4)ARG1 <= ARG2

       注释:ARG1 小于或等于ARG2时为真,取值1

       示例:

            linux-mdcc:~ # expr 0 \<= 1

            1

            linux-mdcc:~ # expr 1 \<= 1

            1

            linux-mdcc:~ # expr 0 \> 0

            0

 

 

       5)ARG1 = ARG2

       注释:ARG1 等于ARG2时为真,取值1

       示例:

            linux-mdcc:~ # expr 1 \= 1

            1

            linux-mdcc:~ # expr 2 \= 1

            0

            linux-mdcc:~ # expr 1 \!= 1

            0

 

       6)ARG1 != ARG2

       注释:ARG1 不等于ARG2时为真,取值1

       示例:

            linux-mdcc:~ # expr 1 != 2

            1

            linux-mdcc:~ # expr 1 != 1

            0

 

       7)ARG1 >= ARG2

       注释:ARG1 大于或等于ARG2时为真,取值1

       示例:

            linux-mdcc:~ # expr 2 \>= 1

            1

            linux-mdcc:~ # expr 1 \>= 1

            1

            linux-mdcc:~ # expr 0 \>= 1

            0

 

       8)ARG1 > ARG2

       注释:ARG1 大于ARG2时为真,取值1

       示例:

            linux-mdcc:~ # expr 1 \> 0

           

            linux-mdcc:~ # expr 0 \> 1

            0

            linux-mdcc:~ # expr 1 \> 1

            0

 

 

    2、数学表达式求值

       9)ARG1 + ARG2

       注释:加法运算

       示例:

            linux-mdcc:~ # expr 1 + 1

            2

 

       10)ARG1 - ARG2

       注释:减法运算

       示例:

            linux-mdcc:~ # expr 3 - 1

            2

 

       11)ARG1 * ARG2

       注释:乘法运算

       示例:

            linux-mdcc:~ # expr 2 \* 4

           

 

       12)ARG1 / ARG2

       注释:除法运算

       示例:linux-mdcc:~ # expr 8 \/ 2

             4

 

       13)ARG1 % ARG2

       注释:求余运算

       示例:

            linux-mdcc:~ # expr 8 % 3

            2

 

    3、字符表达式求值

       14)string : REGEXP

       注释:string 匹配到REGEXP时为真,取值为1

       示例:

            linux-mdcc:~ # expr aaaaAAAA \: [a-zA-Z].*

            8

       15)match STRING REGEXP

       注释:同string : REGEXP

       示例:

            linux-mdcc:~ # expr match aaaaAAAA [a-zA-z].*

            8

       16)substr STRING POS LENGTH

       注释:截取STRING ,从POS位置截取长度为LENGTH的子串

       示例:

            linux-mdcc:~ # expr substr strings 2 3

            tri

      

       17)index STRING CHARS

       注释:取出CHARS在STRING 中的索引,如果没找到,值为0;这个命令的结果不是很准确

       示例:

            linux-mdcc:~ # expr index abcdefghijk bc

            2

 

       18)length STRING

       注释:字符串的长度

       示例:

            linux-mdcc:~ # expr length adfasfaf

            8

 

       19)+ TOKEN

       注释:字符串连接符,限于个人理解

       示例:

            linux-mdcc:~ # expr 1+1

            1+1

            linux-mdcc:~ # expr + match

            match

            linux-mdcc:~ # expr + /

            /

 

 

结束语:一直觉得expr不是很好用,好在各种Shell也有自己的运算方法

 

三、算术运算

    1、Bourne shell

       1)整数运算

         注释:没有内置算术运算,使用expr命令进行简单的整数算术运算

         示例:

         wsnjc-2268:~ # expr 1 + 4

         5

         wsnjc-2268:~ # expr 1+4

         1+4

         wsnjc-2268:~ # expr 5 + 9 / 3

         8

         wsnjc-2268:~ # expr 5 * 4

         expr: syntax error

         wsnjc-2268:~ # expr 5 \* 4 - 2

         18

         wsnjc-2268:~ # expr 11 % 3

         2

         wsnjc-2268:~ # num=1

         wsnjc-2268:~ # num=`expr $num + 1 `

         wsnjc-2268:~ # echo $num

         2

       2)浮点运算

         注释:没有内置算术运算,使用bc,awk程序进行浮点运算

         示例:

         wsnjc-2268:~ # echo "scale=3; 13 / 2" | bc

         6.500

         wsnjc-2268:~ # n=`bc << EOF

        scale=3

        13/2

        EOF`

         wsnjc-2268:~ # echo $n

         6.500

         wsnjc-2268:~ # product=`echo "sdf" | awk 'BEGIN{x=2.45;y=3.123}{printf "%.2f\n",x*y}'`

         wsnjc-2268:~ # echo $product

         7.65

     2、C shell和TC shell

        1)整数算术运算

          语法:运算符+ - * / % << >> += -= *= /= ++ --      

          注释:只支持整数的算术运算,符号@用于将计算结果赋给数值变量;变量(作为右操作数的)需要使用$符号引用其值

          示例:

          linux-mdcc /root# @ sum = 4 + 6

          linux-mdcc /root# echo $sum

          10

          linux-mdcc /root# @ sum++

          linux-mdcc /root# echo $sum

          11

          linux-mdcc /root# @ sum += 3

          linux-mdcc /root# echo $sum

          14

          linux-mdcc /root# @ sum--

          linux-mdcc /root# echo $sum

          13

          linux-mdcc /root# @ n = 3+4

          @: Badly formed number.

        2)浮点算术运算

          注释:不支持浮点运算,使用使用程序进行操作

     示例:同上,使用bc和awk程序进行操作

     3、Korn shell

        1)算术运算

          语法:typeset -i -i# -F -E; integer是typeset -i 的别名

          注释:支持整型运算,1998版后支持浮点运算

          示例:

          linux-mdcc:/root # typeset -i num

          linux-mdcc:/root # num=hello

          linux-mdcc:/root # echo $num

          0

          linux-mdcc:/root # num=5 + 5

          ksh: +: not found [No such file or directory]

          linux-mdcc:/root # num=5+5

          linux-mdcc:/root # echo $num

          10

          linux-mdcc:/root # num=4*6

          linux-mdcc:/root # echo $num

          24

          linux-mdcc:/root # num="4 * 6"

          linux-mdcc:/root # echo $num

          24

          linux-mdcc:/root # num=6.789

          linux-mdcc:/root # echo $num

          6

        2)使用不同的基数

          linux-mdcc:/root # num=15

          linux-mdcc:/root # typeset -i2 num

          linux-mdcc:/root # print $num

          2#1111

          linux-mdcc:/root # typeset -i8 num

          linux-mdcc:/root # print $num

          8#17

          linux-mdcc:/root # typeset -i16 num

          linux-mdcc:/root # print $num

          16#f

          linux-mdcc:/root # read number

          2#1101

          linux-mdcc:/root # print $number

          2#1101

          linux-mdcc:/root # typeset -i number

          linux-mdcc:/root # print $number

          13

          linux-mdcc:/root # typeset -i2 number

          linux-mdcc:/root # print $number

          2#1101

          linux-mdcc:/root # typeset -i8 number

          linux-mdcc:/root # print $number

          8#15

        3)let命令

          注释:Korn shell的内置命令,用来执行整型运算

          示例:

               linux-mdcc:/root # let i=i+1

               linux-mdcc:/root # print $i

               6

               linux-mdcc:/root # let "i = i + 2"

               linux-mdcc:/root # print $i

               8

               linux-mdcc:/root # let "i+=1"

               linux-mdcc:/root # print $i

               9

        4)对于空格,可以用(())和""屏蔽掉

               linux-mdcc:/root # ((i=9))

               linux-mdcc:/root # (( i = i * 6))

               linux-mdcc:/root # ((i = 9 ))

               linux-mdcc:/root # clear

               linux-mdcc:/root # (( i = 9 ))

               linux-mdcc:/root # (( i = i * 6 ))

               linux-mdcc:/root # print $i

               54

               linux-mdcc:/root # (( i > 0 && i <= 10 ))

               linux-mdcc:/root # print $?

               1

               linux-mdcc:/root # j=100

               linux-mdcc:/root # (( i < j || i == 5 ))

               linux-mdcc:/root # print $?

               0

               linux-mdcc:/root # if (( i < j && i == 54 ))

              then

              print True

              fi

               True

 

     4、Bash shell

        1)算术运算

         注释:同Korn shell,用declare声明整型;(())中的变量(作为右操作数的)前面也可以加上$符号,效果相同

         示例:

         linux-mdcc:~ # declare -i num

         linux-mdcc:~ # num=hello

         linux-mdcc:~ # echo $num

         0

         linux-mdcc:~ # num=5 + 5

        ~

         linux-mdcc:~ # num=5+5

         linux-mdcc:~ # echo $num

         10

         linux-mdcc:~ # num=4*6

         linux-mdcc:~ # echo $num

         24

         linux-mdcc:~ # num="4 * 6"

         linux-mdcc:~ # echo $num

         24

         linux-mdcc:~ # num=6.5

         -bash: 6.5: syntax error in expression_r(error token is ".5")

         ==============================================================

         linux-mdcc:~ # declare -i x=017

         linux-mdcc:~ # echo $x

         15

         linux-mdcc:~ # x=2#101

         linux-mdcc:~ # echo $x

         5

         linux-mdcc:~ # x=8#17

         linux-mdcc:~ # echo $x

         15

         linux-mdcc:~ # x=16#b

         linux-mdcc:~ # echo $x

         11

         ==============================================================

         linux-mdcc:~ # let i=5

         linux-mdcc:~ # let i=i+1

         linux-mdcc:~ # echo $i

         6

         linux-mdcc:~ # let "i = i + 2"

         linux-mdcc:~ # echo $i

         8

         linux-mdcc:~ # let "i+=1"

         linux-mdcc:~ # echo $i

         9

         linux-mdcc:~ # i=3

         ==============================================================

         linux-mdcc:~ # ((i+=4))

         linux-mdcc:~ # echo $i

         7

         linux-mdcc:~ # ((i=i-2))

         linux-mdcc:~ # echo $i

         5

 

      2)浮点运算

        注释:同bc,awk计算程序对浮点数的计算

 

  

 

 

结束语:这里遇到了bc运算;内联输入;以及awk操作,实在是没有想到的,这些功能都好强大又容易被大家忽略的啊!

 

 

  

0

阅读 收藏 喜欢 打印举报/Report
  

新浪BLOG意见反馈留言板 欢迎批评指正

新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 产品答疑

新浪公司 版权所有