shell脚本【命令2】数值计算相关

可以把数值计算的相关命令分为三类:

1、是计算表达式的值:expr

2、整数算术运算:let  或  ((…))

3、修改变量的类型,然后直接运算


一:计算表达式的值

    命令:expr

    功能:expr命令可以做字符串比较操作和计算表达式的值。

    其中,expr命令的字符串比较操作基本被[[…]]结构代替。不过,expr的另一个功能,计算整数表达式的值,还是会经常用到的。

     expr命令支持的整数算术运算表达式格式:

    ① 求和

                expr exp1 + exp2

        注意:各项中间必须要有空格,下同↓↓↓

    ② 求差

                expr exp1 – exp2

    ③ 求积

                expr exp1 \* exp2

     注意求积表达式的区别,在“*”前要加转义符号“\”

    ④ 求商

                expr exp1 / exp2

    ⑤ 取余

                expr exp1 % exp2

 

    举例:

        function_testTwo( )               

        {

                i=1

                echo `expr $1 + 8` >>test7     #需要注意的是expr命令中的变量需要进行引用;$1 是引用位置参数。

                echo $1

                echo `expr $i + 1` >>test7      #同时变量i也需要进行引用

        }

    注意:expr $1 + 8这是一句命令,如果想要引用这个命令的结果,则必须用命令替换来获取命令的输出。可以通过反引号或者$(…)来进行命令替换。

 

二:计算算术表达式

    命令:let   或  ((…)) 

      注意区分结构:“((…))”与“[[…]]”。前者是计算整数表达式命令,后者是测试命令test的简写:点击打开链接

       支持的命令:

    ① 求和

        let var=exp1+exp2

        let “var=exp1+exp2”

        ((var = exp1 + exp2))

        分析:三种写法,结果完全一样。同时,第一种写法,整数算术表达式之间决不能有空格。剩下两种写法,在任何地方加不加空格没区别,包括等号两边,下同 ↓↓↓

    ② 求差

        let var=exp1-exp2

    ③ 求积

        let var=exp1*exp2

    ④ 求商

        let var=exp1/exp2

    ⑤ 取余

        let var=exp1%exp2

  除了上述五种算术运算之外,let和((…))结构还支持+=、-=、*=、/=、%=,就不一一罗列了,基本差不多写法。

 

三、两种的区别:

        expr命令相对于let或((…))命令来说的区别:

       1、不同一:对象不是太一样:一个是表达式,一个是算术表达式(有等号)

       expr命令是计算表达式的值,并返回表达式最终的计算结果

    虽然let和((…))命令也可以计算表达式的值,但是,并不会返回表达式的计算结果,而是返回的是一种出口状态。如果表达式的计算结果为0,则出口状态为1;表达式的计算结果非0,出口状态为0。点击打开链接

       举例:

(( 5+5 ))
echo "The status is $?"

       分析:((5+5))最终不会有标准输出的产生,伴随的只有一个是否成功的出口状态

       上面这个例子的出口状态为0,如果是((5>9)),则出口状态为1。

    总结来说就是:let和((…))命令的计算表达式功能一般没用,expr用来计算并返回表达式的最终结果。

       反过来同样适用,let和((…))命令主要用来计算等式,而expr命令并不能。所以,let和((…))命令与expr命令的分工还是挺明确的。

       不过其实可以通过((…))得到表达式的值,不过需要与$符号一起使用:$(( expression ))

       比如:i=$(( i+1 )),和i=$( expr $i + 1 )或i=`expr $i + 1` (反引号),结果一样。

    2、不同二:写的有点不一样

       expr expression    与   let var=expression  或  ((var=exprssion))

       expr的expression中的变量需要通“$”来引用才可以正常使用,但是在let和((…))结构中不需要,可以直接对变量进行操作。

       并且expr中的expression各项必须要有空格,而let和((…))结构如果"var=expression",加了双引号,则中间怎么写都无所谓。


四、修改变量的类型,然后直接运算

    通过typeset或declare命令进行变量声明:

    如果把变量声明为了整数变量,则可以直接执行算术运算,而不需要使用expr或let命令。

    如果不通过typeset或declare命令对变量进行声明,则shell将会把赋予变量的值看做字符串。所以才有expr或let命令进行执行。

    使用typeset把变量声明成整型:-i

    ① 脚本举例test.sh:

            typeset -i number=3

            number=number/3

            echo $number

            number=6/3

            echo $number

    输出:3 2

     分析:输出的为,直接计算的结果

     如果没有对变量类型进行声明:

    ② 脚本举例test.sh:

            number=3

            number=number/3

            echo $number

    输出:number/3    

    分析:因为在number=number/3这一句,没有对number进行变量引用,而是作为了number/3字符串的一部分。

    ③ 脚本举例test.sh

            number=3

            number=$number/3

            echo $number

    输出:3/3

    ④ 脚本举例test.sh:

            number=6/3

            echo $number

    输出:6/3

     总结:

    在上述四个例子中,只有例1对变量进行了整型声明,也只有例1的表达式是直接计算得到了结果,剩下的三个例子,均没有计算,而是作为字符串进行处理。


    typeset命令也可以设置变量的权限,比如修改为只读

    typeset -r var

    这样可以保证那些重要的不会变的参数,能够不被误修改。一般用declare的较多,可以help declare进行查看。



阅读更多
个人分类: shell脚本
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页

关闭
关闭
关闭