详解Shell编程之变量数值计算(一)

如果要执行运算,那就少不了运算符,和其他的编程语言相似,shell也有很多的运算符如下:

+、-、:代表着加号 和减号 或者,负号

*、/、%:代表着乘号,除号,和取模。

**   : 幂运算

++、-- :表示着增加或者减少,它可以放在前置,也可以放在变量的结尾

!、||、&&、(取反)(或) (and)

<、<=、>、>=  :比较符号,小于、小于等于、大于、大于等于

==、!=、= :相等,不相等, =表示相等于

<<     >>  向左移动 向右移动

等等,这里就不说了 到后面实践中再见!

Shell编程之算术运算命令

(())  用于整数之间常用的运算符,效率高

let :用于整数运算,类似于(())

expr :用于整数运算,但是还有其他功能

bc :Linux下的一个计算程序,适合整数及小数运算

$[] :用于整数运算

awk:awk既可以整数运算,也可以小数运算

declare: 定义变量值和属性,-i参数可以用于定义整形变量,做运算

第一眼看到这些 感觉很复杂,心乱,但是没有关系,慢慢的就好了~~~

一、双小括号(()) 数值运算命令

双小括号的作用是进行数值运算与数值的比较,它的效率很高,用法很灵活,是企业运维人员经常采用的操作符
((e=e+1)) 它的作用就是把e+1的结果赋值给变量e但是不可以用 echo ((e=e+1))来使用,但可以使用echo $((e=e+1))
e=$((e=e+1)) 作用就是把e+1的执行结果赋值给变量e

数值比较

((8>7&&5==5)) 用于数值之前的比较,用于条件判断

echo $((2+1)) 用于直接输出运算表达式的结果,在(()) 前面加$符号

案例1:双小括号"(())"数值运算实践

[root@shell-yankerp sh]# echo $((1+1)) #计算1+1后输出
2  #那么结果就是等于2
[root@shell-yankerp sh]# 

以此类推使用减号

[root@shell-yankerp sh]# echo $((6-3)) #计算6-3等于多少
3  #结果为3
[root@shell-yankerp sh]# 

是不是感觉有点简单。那么接下来利用"(())"进行稍微复杂的一些综合算术运算

[root@shell-yankerp sh]# ((a=1+2**3-4%3)) 

以上例子也就是说,首先a是一个变量名,那么在a=后面的一些计算的结果会赋值给a这个变量,那么首先我们得知道后面的计算结果是多少,在这个变量中 我们用到了+号"**"以及"-"号包括“%”首先计算过程是这样的。先算乘除,后算加减

2**3 等于 2x2x2=8 乘算出来之后算除。 4%3=1 取模---- 8-1=7 最后1+7=8 最后结果为8 输出如下:

例如2:

[root@shell-yankerp sh]# b=$((1+2**3-4%3)) #在这里b是一个变量 将变量名的计算结果赋值给b
[root@shell-yankerp sh]# echo $b     #输出如下:
8
[root@shell-yankerp sh]#

其实例1 和2都是差不多的 只不过是用了不同的方法!!!

例3:特殊运算符号的运算实例

[root@shell-yankerp sh]# a=8    #首先a变量名 = 变量值 等于8 那么a就是8
[root@shell-yankerp sh]# echo $((a=a+2)) #原来a=8 那么现在a+2 结果为10
10
[root@shell-yankerp sh]# echo $((a+=1))  #当结果为10 这一行代表 a=a+1那么就等于11
11
[root@shell-yankerp sh]# echo $((a**2))  #目前a=11 那么a**2 a的二次方 那么等于11x11=121 输出如下:
121
[root@shell-yankerp sh]# 

例4:利用(())双括号,进行比较判断

[root@shell-yankerp sh]# echo $((2>1)) #当条件2>1正确后输出了1表示真
1
[root@shell-yankerp sh]# echo $((2>3)) #当条件2>3错误后输出0
0
[root@shell-yankerp sh]# echo $((6==6)) #6==6 那么就输出1
1
[root@shell-yankerp sh]#  

if 判断小实战

在以上的图中不用想肯定是输出条件成立继续运行了因为8本来就大于5;7本来就等于7 输出如下:

我们尝试的改下脚本如下:

在上图中8等于5肯定是错误的 那么输出如下:

上面涉及到了数字及变量必须为整数,不能是小数... 但是可以用bc来解决后面会说到。

案例:在变量前后使用++、--、特殊运算符的表达式

首先我们需要知道++是什么意思

++、-- :表示着增加或者减少,它可以放在前置,也可以放在变量的结尾

[root@shell-yankerp sh]# a=10
[root@shell-yankerp sh]# echo $((a++))
10
[root@shell-yankerp sh]# echo $a
11
[root@shell-yankerp sh]# 

以上内容中的a=10 那么a是变量名 变量值等于10 那么echo $((a++)) ++的意思上面已经说过了,输出结果为10 因为++在a的后面 所以先输出a的值为10 那么继续echo $a 那么就变成11 因为a++后面增加1

例2:

[root@shell-yankerp sh]# a=11
[root@shell-yankerp sh]# echo $((a--))
11
[root@shell-yankerp sh]# echo $a
10
[root@shell-yankerp sh]# 

以上就是--的用法了。这里不在说了

在以下的案例中我相信的大家肯定知道了在前面加++ 和在后面加++的区别了 如下:

[root@shell-yankerp sh]# echo $a
10
[root@shell-yankerp sh]# echo $((--a))
9
[root@shell-yankerp sh]# a=9
[root@shell-yankerp sh]# echo $a
9
[root@shell-yankerp sh]# echo $((++a))
10
[root@shell-yankerp sh]# 

例:通过(())运算后赋值给变量

[root@shell-yankerp sh]# yankerp=99
[root@shell-yankerp sh]# echo $((yankerp+1))
100
[root@shell-yankerp sh]# echo $(( yankerp+1 ))
100
[root@shell-yankerp sh]# 

在以上的案例中,有空格和没空格都是一样的。

包含(())各种常见的运算符命令执行如下:

[root@shell-yankerp sh]# echo $((3+2))
5
[root@shell-yankerp sh]# echo $((3-2))
1
[root@shell-yankerp sh]# echo $((3**2))
9
[root@shell-yankerp sh]# echo $((3*2))
6
[root@shell-yankerp sh]# echo $((3/2))
1
[root@shell-yankerp sh]# echo $((3%2))
1
[root@shell-yankerp sh]# 

各种(())运算的shell脚本案例

#!/bin/bash
# DATE:Wed Jan 31 19:49:59 CST 2018
# This is a yankerp! 

a=6
b=3
echo "a-b=$((a-b))"
echo "a+b=$((a+b))"
echo "a/b=$((a/b))"
echo "a**b=$((a**b))"

输出结果为如下:

[root@shell-yankerp sh]# sh test.sh  
a-b=3 
a+b=9 
a/b=2 
a**b=216 
[root@shell-yankerp sh]#

特殊位置变量+数值运算实战案例如下:

#!/bin/bash
# DATE:Wed Jan 31 19:49:59 CST 2018
# This is a yankerp! 

a=$1
b=$2
echo "a-b=$((a-b))"
echo "a+b=$((a+b))"
echo "a**b=$((a**b))"
echo "a/b=$((a/b))

在以上的脚本中 我们定义了特殊的位置变量 下面定义了数值运算,那么这个脚本的功能是,当我们输入两个字符,其中第一个字符赋值给了变量a 第二个字符赋值给了变量b 那么在下面进行数值运算,如果此脚本看不懂的大家可以参考我这篇文章http://www.jb51.net/article/134246.htm

运行结果如下:

[root@shell-yankerp sh]# sh test.sh 6 3 
a-b=3 
a+b=9 
a**b=216 
a/b=2 
[root@shell-yankerp sh]#

这也就是特殊位置变量+本章的变量数值运算的结合

let运算命令的用法

例如

[root@shell-yankerp ~]# a=2
[root@shell-yankerp ~]# a=a+8  #没有用let
[root@shell-yankerp ~]# echo $a
a+8  #输出结果
[root@shell-yankerp ~]# unset a #清除变量
[root@shell-yankerp ~]# a=2
[root@shell-yankerp ~]# let a=a+8 使用let
[root@shell-yankerp ~]# echo $a
10
[root@shell-yankerp ~]# 

其实还可以这么实现,如下:

[root@shell-yankerp ~]# a=2
[root@shell-yankerp ~]# echo $((a=a+8))
10
[root@shell-yankerp ~]# echo $a
10
[root@shell-yankerp ~]# unset a
[root@shell-yankerp ~]# a=2
[root@shell-yankerp ~]# let a=a+8
[root@shell-yankerp ~]# echo $a
10
[root@shell-yankerp ~]#  

两者区别!!!如上

expr命令用法实例:

[root@shell-yankerp sh]# expr 2 + 2
4
[root@shell-yankerp sh]# expr 4 - 2
2
[root@shell-yankerp sh]# expr 4 \* 2
8
[root@shell-yankerp sh]# expr 4 / 2
2
[root@shell-yankerp sh]#  

当我们选择用*号需要拿\转义、需要注意在用expr命令时 左右两侧必须要空格

2、expr配合变量实例

[root@shell-yankerp sh]# a=10
[root@shell-yankerp sh]# a=`expr $a + 10`
[root@shell-yankerp sh]# echo $a
20
[root@shell-yankerp sh]# 

expr的企业级实战案例:

[root@shell-yankerp sh]# i=5  #这里设置了一个变量 i=5
[root@shell-yankerp sh]# expr $i + 6 &>/dev/null  #那么我们使用expr命令 $i + 6 这里的6是一个整数
[root@shell-yankerp sh]# echo $?  #执行完成后我们使用特殊变量 $?来判断以上命令
0     ---返回结果为0
[root@shell-yankerp sh]# expr $i + zhangsan &>/dev/null #同时这里又设置了一个变量 在这里的zhangsan是字符串
[root@shell-yankerp sh]# echo $?    #使用特殊变量判断
2   #结果为2
[root@shell-yankerp sh]#  

利用expr做计算,将一个未知的变量和一个已知的一个整数相加,看返回的值是否为0,如果默认是0 那么就是一个整数。如果非0则输入的就是字符串不是整数。

例:通过参数判断输出内容是否为整数

#!/bin/bash
expr $1 + 1 &>/dev/null  #这里是一个命令 使用了expr 也使用了特殊的位置变量
if [ "$?" -eq 0 ]     #如果以上命令执行结果为0
 then      #那么
  echo "输入的是整数~"  #输出一条 输入的是整数
 else   #否则
  echo "/bin/sh $# 请输入一个整数"   这里也使用了特殊的位置变量
fi

运行脚本测试

[root@shell-yankerp sh]# cat aaa.sh
#!/bin/bash
expr $1 + 1 &>/dev/null
if [ "$?" -eq 0 ]
 then
  echo "输入的是整数~"
 else
  echo "/bin/sh $0 请输入一个整数"
fi
[root@shell-yankerp sh]# sh aaa.sh 123
输入的是整数~
[root@shell-yankerp sh]# sh aaa.sh zhangsan lisi
/bin/sh aaa.sh 请输入一个整数
[root@shell-yankerp sh]# 

实战:第一关判断参数个数是否为2.若不是请给出提示
          第二关判断参数是否为整数,如果不是那么继续给出提示
          第三关做运算~~~

#!/bin/bash
if [ "$#" -ne "2" ]
 then
  echo "/bin/bash $0 请输出两个数值..."
  exit 1
fi
#no.2
a=$1
b=$2
expr $1 + 1 &>/dev/null
if [ "$?" -ne "0" ]
 then
  echo "请输入数值..."
  exit 1
fi
#no.3
echo "a+b=$((a+b))"
echo "a-b=$((a-b))"
echo "a/b=$((a/b))"
echo "a*b=$((a*b))"
echo "a**b=$((a**b))"
echo "a%b=$((a%b))" 

剖析:在以上脚本中其实很简单,第一if 如果输入的不是两个传参值,那么给出提示 这是第一段if条件语句,如果输入的是两个数值,那么继续执行下面的条件,在第二个条件使用了位置参数变量$1 使用了expr命令来判断用户输入的是数字还是字符串,当用户输入的是数字那么就是返回是成功的 那么我们使用了if语句 如果上面命令执行成功 如果不等于0 那么给出相应的提示,最后前面的两个条件成立,那么接下来进行算法,这个前面是说过的。

执行脚本如下:

好了 本次就到这里,希望阅读者快快吸收~~~ 后续不断更新 谢谢大家,也希望大家多多支持我们。

声明:以上文章是<<跟着老男孩学Linux运维Shell编程实战>>第五章;一部分看完的总结!

您可能感兴趣的文章:

  • 详解Shell编程之变量数值计算(二)
(0)

相关推荐

  • 详解Shell编程之变量数值计算(二)

    OK,数值运算(上)是我看完的一小部分,大概的结束脚本如下:(回顾~~) #!/bin/bash a=$1 b=$2 expr $1 + 1 &>/dev/null if [ "$?" -ne "0" ] then echo "请输入数字" exit 1 fi if [ "$#" -ne "2" ] then echo "请输入两个数字" exit 1 fi echo &q

  • 详解Shell编程之变量数值计算(一)

    如果要执行运算,那就少不了运算符,和其他的编程语言相似,shell也有很多的运算符如下: +.-.:代表着加号 和减号 或者,负号 *./.%:代表着乘号,除号,和取模. **   : 幂运算 ++.-- :表示着增加或者减少,它可以放在前置,也可以放在变量的结尾 !.||.&&.(取反)(或) (and) <.<=.>.>=  :比较符号,小于.小于等于.大于.大于等于 ==.!=.= :相等,不相等, =表示相等于 <<     >> 

  • Shell编程之变量的高级用法详解

    变量替换 语法 说明 ${变量名#匹配规则} 从变量开头进行规则匹配,将符合最短的数据删除 ${变量名##匹配规则} 从变量开头进行规则匹配,将符合最长的数据删除 ${变量名%匹配规则} 从变量尾部进行规则匹配,将符合最短的数据删除 ${变量名%%匹配规则} 从变量尾部进行规则匹配,将符合最长的数据删除 ${变量名/旧字符串/新字符串} 变量内容符合就字符串,则第一个旧字符串会被新字符串替换 ${变量名//旧字符串/新字符串} 变量内容符合就字符串,则全部的旧字符串会被新字符串替换 示例 var

  • 详解shell 变量的高级用法示例

    变量删除和替换 案例:从头开始匹配,将符合最短的数据删除 (#) variable_1="I love you, Do you love me" echo $variable_1 variable_2=${variable_1#*ov} echo $variable_2 案例:从头开始匹配,将复合最短的数据删除(##) varible_3=${variable_1##*ov} echo $varible_3 案例:替换字符串,只替换第一次匹配成功的(/) echo $PATH var6

  • 详解shell 变量

    1.简介 变量是任何一种编程语言都必不可少的组成部分,变量用来存放各种数据.脚本语言在定义变量时通常不需要指明类型,直接赋值就可以,Shell变量也遵循这个规则. 在Bash shell 中,每一个变量的值都是字符串,无论你给变量赋值时有没有使用引号,值都会以字符串的形式存储.这意味着,Bash shell 在默认情况下不会区分变量类型,即使你将整数和小数赋值给变量,它们也会被视为字符串,这一点和大部分的编程语言不同.如C/C++ ,变量分为整数.浮点数.字符串.布尔等多种类型.当然,如果有必要

  • 详解shell脚本中的case条件语句介绍和使用案例

    #前言:这篇我们接着写shell的另外一个条件语句case,上篇讲解了if条件语句.case条件语句我们常用于实现系统服务启动脚本等场景,case条件语句也相当于if条件语句多分支结构,多个选择,case看起来更规范和易读 #case条件语句的语法格式 case "变量" in 值1) 指令1... ;; 值2) 指令2... ;; *) 指令3... esac #说明:当变量的值等于1时,那么就会相应的执行指令1的相关命令输出,值等于2时就执行指令2的命令,以此类推,如果都不符合的话

  • 详解shell脚本[] [[]] -n -z 的含义解析

    在写脚本的时候,总是搞不懂[] [[]]的区别,这次写一个总结,把它掌握牢固 []和test 两者是一样的,在命令行里test expr和[ expr ]的效果相同. test的三个基本作用是判断文件.判断字符串.判断整数.支持使用 "与或非" 将表达式连接起来. test中可用的比较运算符只有==和!=,两者都是用于字符串比较的,不可用于整数比较,整数比较只能使用-eq, -gt这种形式. 无论是字符串比较还是整数比较都千万不要使用大于号小于号.当然,如果你实在想用也是可以的,对于字

  • 详解Shell脚本中调用另一个Shell脚本的三种方式

    主要以下有几种方式: Command Explanation fork 新开一个子 Shell 执行,子 Shell 可以从父 Shell 继承环境变量,但是子 Shell 中的环境变量不会带回给父 Shell. exec 在同一个 Shell 内执行,但是父脚本中 exec 行之后的内容就不会再执行了 source 在同一个 Shell 中执行,在被调用的脚本中声明的变量和环境变量, 都可以在主脚本中进行获取和使用,相当于合并两个脚本在执行. 第一种:fork 特点:会生成子PID而且可重复被

  • 详解Shell 脚本中 “$” 符号的多种用法

    通常情况下,在工作中用的最多的有如下几项: $0:Shell 的命令本身 1到9:表示 Shell 的第几个参数 $? :显示最后命令的执行情况 $#:传递到脚本的参数个数 $$:脚本运行的当前进程 ID 号 $*:以一个单字符串显示所有向脚本传递的参数 $!:后台运行的最后一个进程的 ID 号 $-:显示 Shell 使用的当前选项 ...... 今天将通过以上几种选项并做进一步的操作案例: 1.引用变量 引用变量时,使用 $ 符号直接来进行引用,以及包括循环变量: [root@localho

  • 详解shell 函数定义与调用

    一.Shell函数定义格式 shell函数定义格式,各部分说明如下: [ function ]等中括号括起来部分----表示可选(即可有可无) your_function_name部分----为函数名 your_shell_commands部分----为函数代码:shell一般以行为单位,但可以使用"\"换行,也可以在单行内使用";"作为分隔符 return int部分----shell函数可以有返回值,但只能返回整数不能返回字符串 [ function ] you

随机推荐