xml地图|网站地图|网站标签 [设为首页] [加入收藏]

Shell编程之运算,详解Shell编程之变量数值计算

来源:http://www.ccidsi.com 作者:呼叫中心培训课程 人气:132 发布时间:2019-06-12
摘要:OK,数值运算(上)是笔者看完的一小部分,大概的收尾脚本如下:(回想~~) 假若要举办运算,这就必需运算符,和任何的编制程序语言相似, shell也是有繁多的运算符如下: 一、变

OK,数值运算(上)是笔者看完的一小部分,大概的收尾脚本如下:(回想~~)

假若要举办运算,这就必需运算符,和任何的编制程序语言相似,shell也是有繁多的运算符如下:

一、变量的数值计算

#!/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 "a b=$((a b))" 
echo "a-b=$((a-b))" 
echo "a*b=$((a*b))" 
echo "a/b=$((a/b))" 
echo "a%b=$((a%b))" 

、-、:代表着加号 和减号 恐怕,负号

一.算术运算符

常用的演算符号
图片 1

常用的演看相令
图片 2

(壹)双小括号
骨干语法
图片 3

1)利用“(())”举行轻易运算

[root@codis-178 ~]# echo $((1 1))
2
[root@codis-178 ~]# echo $((6-3))
3
[root@codis-178 ~]# ((i=5))
[root@codis-178 ~]# ((i=i*2))
[root@codis-178 ~]# echo $i
10

二)利用“(())”举办复杂运算

[root@codis-178 ~]# ((a=1 2**3-4%3))
[root@codis-178 ~]# echo $a
8
[root@codis-178 ~]# b=$((1 2**3-4%3))
[root@codis-178 ~]# echo $b
8
[root@codis-178 ~]# echo $((1 2**3-4%3))
8
[root@codis-178 ~]# a=$((100*(100 1)/2))
[root@codis-178 ~]# echo $a
5050
[root@codis-178 ~]# echo $((100*(100 1)/2))
5050

三)特殊运算符的演算

[root@codis-178 ~]# a=8
[root@codis-178 ~]# echo $((a=a 1))
9
[root@codis-178 ~]# echo $((a =1))
10
[root@codis-178 ~]# echo $((a**2))
100

四)相比和推断

[root@codis-178 ~]# echo $((3<8))
1
[root@codis-178 ~]# echo $((8<3))
0
[root@codis-178 ~]# echo $((8==8))
1
[root@codis-178 ~]# if ((8>7&&5==5))
> then
> echo yes
> fi
yes

5)在变量前后使用--和 特殊运算符的表明式

[root@codis-178 ~]# a=10
[root@codis-178 ~]# echo $((a  ))
10
[root@codis-178 ~]# echo $a
11
[root@codis-178 ~]# a=11
[root@codis-178 ~]# echo $((a--))
11
[root@codis-178 ~]# echo $a
10
[root@codis-178 ~]# a=10
[root@codis-178 ~]# echo $a
10
[root@codis-178 ~]# echo $((--a))
9
[root@codis-178 ~]# echo $((  a))
10
[root@codis-178 ~]# echo $a
10

陆)通过“(())”运算后赋值给变量

[root@codis-178 ~]# myvar=99
[root@codis-178 ~]# echo $((myvar 1))
100
[root@codis-178 ~]# echo $((   myvar 1   ))
100
[root@codis-178 ~]# myvar=$((myvar 1))
[root@codis-178 ~]# echo $myvar
100

七)包罗“(())”的各样大规模运算

[root@codis-178 ~]# echo $((6 2))
8
[root@codis-178 ~]# echo $((6-2))
4
[root@codis-178 ~]# echo $((6*2))
12
[root@codis-178 ~]# echo $((6/2))
3
[root@codis-178 ~]# echo $((6%2))
0
[root@codis-178 ~]# echo $((6**2))
36

八)在shell脚本中的示例

[root@codis-178 ~]# cat test.sh 
#!/bin/bash

a=6
b=2

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))"

[root@codis-178 ~]# sh test.sh 
a-b=4
a b=8
a*b=12
a/b=3
a**b=36
a%b=0

玖)将上边的剧本中a、b多少个变量通过命令行脚本传参,以贯彻混合运算

[root@codis-178 ~]# cat test.sh 
#!/bin/bash

a=$1
b=$2

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))"

[root@codis-178 ~]# sh test.sh 8 3
a-b=5
a b=11
a*b=24
a/b=2
a**b=512
a%b=2

[root@codis-178 ~]# sh test.sh 3 6
a-b=-3
a b=9
a*b=18
a/b=0
a**b=729
a%b=3

十)完成输入3个数实行演算的计算器

[root@codis-178 ~]# cat yunsuan.sh
#!/bin/bash

print_usage(){
    printf "Please enter an integern"
    exit 1
}
read -p "Please input first number: " firstnum
if [ -n "`echo $firstnum|sed 's/[0-9]//g'`" ];then
    print_usage
fi
read -p "Please input the operators: " operators
if [ "${operators}" != " " ] && [ "${operators}" != "-" ] && [ "${operators}" != "*" ] && [ "${operators}" != "/" ];then
    echo "please use ( |-|*|/)"
    exit 2
fi
read -p "Please input second number: " secondnum
if [ -n "`echo $secondnum|sed 's/[0-9]//g'`" ];then
    printf_usage
fi
echo "${firstnum}${operators}${secondnum}=$((${firstnum}${operators}${secondnum}))"
[root@codis-178 ~]# sh yunsuan.sh 
Please input first number: 5
Please input the operators:  
Please input second number: 16
5 16=21
[root@codis-178 ~]# sh yunsuan.sh 
Please input first number: 9
Please input the operators: *
Please input second number: 24
9*24=216
[root@codis-178 ~]# sh yunsuan.sh 
Please input first number: 76
Please input the operators: -
Please input second number: 24
76-24=52

改良版

[root@codis-178 ~]# cat yunsuan1.sh 
#!/bin/bash

print_usage(){
    printf $"USAGE:$0 NUM1 { |-|*|/} NUM2n"
    exit 1
}
if [ $# -ne 3 ]
    then
        print_usage
fi
firstnum=$1
secondnum=$3
op=$2
if [ -n "`echo $firstnum|sed 's/[0-9]//g'`" ];then
    print_usage
fi
if [ "$op" != " " ] && [ "$op" != "-" ] && [ "$op" != "*" ] && [ "$op" != "/" ]
    then
        print_usage
fi
if [ -n "`echo $secondnum|sed 's/[0-9]//g'`" ];then
    printf_usage
fi
echo "${firstnum}${op}${secondnum}=$((${firstnum}${op}${secondnum}))"
[root@codis-178 ~]# sh yunsuan1.sh 6   8
6 8=14
[root@codis-178 ~]# sh yunsuan1.sh 56   13
56 13=69
[root@codis-178 ~]# sh yunsuan1.sh 56 - 13
56-13=43

[root@codis-178 ~]# sh yunsuan1.sh 2 * 2
USAGE:yunsuan1.sh NUM1 { |-|*|/} NUM2
[root@codis-178 ~]# sh yunsuan1.sh 9 / 3
9/3=3
[root@codis-178 ~]# sh yunsuan1.sh 2 * 2  # 乘号需要转义
2*2=4

(二)let运看相令
一)给自变量加八

[root@codis-178 ~]# i=2
[root@codis-178 ~]# i=i 8
[root@codis-178 ~]# echo $i
i 8
[root@codis-178 ~]# unset i
[root@codis-178 ~]# i=2
[root@codis-178 ~]# let i=i 8
[root@codis-178 ~]# echo $i
10

二)监察和控制Web服务情形,如若访问三次均未果,则报告警察方

[root@codis-178 ~]# cat web.sh 
#!/bin/bash
CheckUrl(){
    timeout=5
    fails=0
    success=0

    while true
        do
            wget --timeout=$timeout --tries=1 http://oldboy.blog.51cto.com -q -O /dev/null
            if [ $? -ne 0 ]
                then
                    let fails=fails 1
            else
                let success =1
            fi
            if [ $success -ge 1 ]
                then
                    echo success
                    exit 0
            fi
            if [ $fails -ge 2 ]
                then
                    Critical="sys is down."
                    echo $Critical|tee|mail -s "$Critical" tongxiaoda@anzhi.com
                    exit 2
            fi
    done
}
CheckUrl
[root@codis-178 ~]# sh web.sh 
success

(3)expr命令
一)expr用于总结

[root@codis-178 ~]# expr 2   2
4
[root@codis-178 ~]# expr 2 - 2
0
[root@codis-178 ~]# expr 2 * 2  # 需要转义
expr: syntax error
[root@codis-178 ~]# expr 2 * 2
4
[root@codis-178 ~]# expr 2 / 2
1

二)expr合作变量总括

[root@codis-178 ~]# i=5
[root@codis-178 ~]# i=`expr $i   6`
[root@codis-178 ~]# echo $i
11

3)剖断四个变量或字符串是或不是为整数

[root@codis-178 ~]# i=5
[root@codis-178 ~]# expr $i   6 &>/dev/null
[root@codis-178 ~]# echo $?
0
[root@codis-178 ~]# i=oldboy
[root@codis-178 ~]# expr $i   6 &>/dev/null
[root@codis-178 ~]# echo $?
2

四)通过传参判定输出内容是或不是为整数

[root@codis-178 ~]# cat expr.sh 
#!/bin/bash
expr $1   1 > /dev/null 2>&1
[ $? -eq 0 ] && echo int || echo chars
[root@codis-178 ~]# sh expr.sh oldboy
chars
[root@codis-178 ~]# sh expr.sh 119
int

5)通过read读入持续等待输入

[root@codis-178 ~]# cat judge_int.sh 
#!/bin/bash
while true
do
    read -p "Pls input:" a
    expr $a   0 >/dev/null 2>&1
    [ $? -eq 0 ] && echo int || echo chars
done
[root@codis-178 ~]# sh judge_int.sh 
Pls input:oldgirl
chars
Pls input:76
int
Pls input:76sd
chars

陆)通过expr决断文件扩充名是不是符合需求

[root@codis-178 ~]# cat expr1.sh 
#!/bin/bash
if expr "$1" : ".*.pub" &>/dev/null
    then
        echo "you are using $1"
else
    echo "Pls use *.pub file"
fi
[root@codis-178 ~]# sh expr1.sh ttt.pub
you are using ttt.pub
[root@codis-178 ~]# sh expr1.sh ttt.py
Pls use *.pub file

7)使用expr命令完毕ssh服务自带的ssh-copy-id公钥分发脚本

[root@codis-178 ~]# sed -n '10,20p' which /usr/bin/ssh-copy-id
sed: can't read which: No such file or directory
if [ "-i" = "$1" ]; then
  shift
  # check if we have 2 parameters left, if so the first is the new ID file
  if [ -n "$2" ]; then
    if expr "$1" : ".*.pub" > /dev/null ; then
      ID_FILE="$1"
    else
      ID_FILE="$1.pub"
    fi
    shift         # and this should leave $1 as the target name
  fi

八)通过expr总结字符串长度

[root@codis-178 ~]# char="I am oldboy"
[root@codis-178 ~]# expr length "$char"
11
[root@codis-178 ~]# echo ${char}
I am oldboy
[root@codis-178 ~]# echo ${char}|wc -L
11
[root@codis-178 ~]# echo ${char}|awk '{print length($0)}'
11

玖)请编写shell脚本,打字与印刷上面语句中字符数一点都不大于陆的单词
I am oldboy linux welcome to our training

[root@codis-178 ~]# cat word_length.sh 
#!/bin/bash
for n in I am oldboy linux welcome to our training
do
    if [ `expr length $n` -le 6 ]
        then
            echo $n
    fi
done
[root@codis-178 ~]# sh word_length.sh 
I
am
oldboy
linux
to
our

(4)bc命令
Linux内部总结器

[root@codis-178 ~]# bc
bc 1.06.95
Copyright 1991-1994, 1997, 1998, 2000, 2004, 2006 Free Software Foundation, Inc.
This is free software with ABSOLUTELY NO WARRANTY.
For details type `warranty'. 
1 1
2
3*3
9

1)将bc用在命令行完毕运算

[root@codis-178 ~]# echo 3 5|bc
8
[root@codis-178 ~]# echo 3.3 5.6|bc
8.9
[root@codis-178 ~]# echo 7.28-5.62|bc
1.66
[root@codis-178 ~]# echo "scale=2;355/113"|bc  # scale保留几位小数
3.14
[root@codis-178 ~]# echo "scale=4;355/113"|bc
3.1415
[root@codis-178 ~]# i=5
[root@codis-178 ~]# i=`echo $i 6|bc`
[root@codis-178 ~]# echo $i
11

二)通过一条命令计算输出1 二 三 ... 10的表明式,并妄想结果

[root@codis-178 ~]# echo `seq -s ' ' 10`=`seq -s " " 10|bc`
1 2 3 4 5 6 7 8 9 10=55
[root@codis-178 ~]# echo `seq -s ' ' 10`=$((`seq -s " " 10`))
1 2 3 4 5 6 7 8 9 10=55
[root@codis-178 ~]# echo `seq -s " " 10`=`seq -s "   " 10|xargs expr`
1 2 3 4 5 6 7 8 9 10=55

(伍)awk完结计算

[root@codis-178 ~]# echo "7.73 3.854" |awk '{print ($1-$2)}'
3.876
[root@codis-178 ~]# echo "367 131" |awk '{print ($1-3)/$2}'
2.77863

(6)$[]标志的演算

[root@codis-178 ~]# i=5
[root@codis-178 ~]# i=$[i 6]
[root@codis-178 ~]# echo $i
11
[root@codis-178 ~]# echo $[2*3]
6
[root@codis-178 ~]# echo $[3%5]
3

打字与印刷数学杨辉三角

[root@codis-178 ~]# cat shuxue.sh 
#!/bin/bash
if (test -z $1);then
    read -p "Input Max Lines:" MAX
else
    MAX=$1
fi
i=1
while [ $i -le $MAX ]
do
    j=1
    while [ $j -le $i ]
    do
        f=$[i-1]
        g=$[j-1]
        if [ $j -eq $i ] || [ $j -eq 1 ];then
            declare SUM_${i}_$j=1
        else
            declare A=$[SUM_${f}_$j]
            declare B=$[SUM_${f}_$g]
            declare SUM_${i}_$j=`expr $A   $B`
        fi
        echo -en $[SUM_${i}_$j]" "
        let j  
    done
    echo
    let i  
done

[root@codis-178 ~]# sh shuxue.sh 
Input Max Lines:4
1 
1 1 
1 2 1 
1 3 3 1

这么些本子中隐含了,特殊变量,数值运看相令expr判别语法。一些简练的if语句,特殊变量$#的用法。最终完成了运算~ 大家可以仿照效法笔者的那篇文章://www.jb51.net/article/134292.htm

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

二.基于Shell变量输入read命令的运算

(1)read命令
语法格式:read [参数] [变量名]
参数:

  • -p prompt 设置指示新闻
  • -t timeout 设置输入等待时间,单位秒
[root@codis-178 ~]# read -t 10 -p "Pls input one num:" num
Pls input one num:18
[root@codis-178 ~]# echo $num
18
[root@codis-178 ~]# read -t 10 -p "Pls input two num:" a1 a2
Pls input two num:5 6
[root@codis-178 ~]# echo $a1
5
[root@codis-178 ~]# echo $a2
6

(2)以read命令读取及传参的总结案例

[root@codis-178 ~]# cat read_size01.sh 
#!/bin/bash
read -t 15 -p "Please input two number:" a b

[ ${#a} -le 0 ] && {
    echo "the first num is null"
    exit 1
}
[ ${#b} -le 0 ] && {
    echo "the second num is null"
    exit 1
}

expr $a   1 &>/dev/null
RETVAL_A=$?
expr $b   1 &>/dev/null
RETVAL_B=$?
if [ $RETVAL_A -ne 0 -o $RETVAL_B -ne 0 ];then
    echo "one of the num is not num,pls input again."
    exit 1
fi

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))"
[root@codis-178 ~]# sh read_size01.sh 
Please input two number:qq
the second num is null
[root@codis-178 ~]# sh read_size01.sh 
Please input two number:12 6
a-b=6
a b=18
a*b=72
a/b=2
a**b=2985984
a%b=0

透过传参方式

[root@codis-178 ~]# cat read_size02.sh 
#!/bin/bash
a=$1
b=$2
Usage(){
    echo $"USAGE:sh $0 num1 num2"
    exit 1
}
if [ $# -ne 2 ];then
    Usage
fi
expr $a   1 >/dev/null 2>&1
[ $? -ne 0 ] && Usage

echo "a-b=$(($a-$b))"
echo "a b=$(($a $b))"
echo "a*b=$(($a*$b))"
echo "a**b=$(($a**$b))"
if [ $b -eq 0 ]
    then
        echo "your input does not allow to run"
        echo "a/b =error"
        echo "a%b =error"
else
    echo "a/b =$(($a/$b))" 
    echo "a%b =$(($a%$b))"
fi

[root@codis-178 ~]# sh read_size02.sh 
USAGE:sh read_size02.sh num1 num2
[root@codis-178 ~]# sh read_size02.sh 7 old
USAGE:sh read_size02.sh num1 num2
[root@codis-178 ~]# sh read_size02.sh 7 3
a-b=4
a b=10
a*b=21
a**b=343
a/b =2
a%b =1

壹、BC命令的用法

**   : 幂运算

bc是UNIX&Linux下的总计器,由此输了足以做总结器使用,还是能当做命令行总计工具使用

、-- :表示着扩大仍旧减小,它能够献身后置,也能够放在变量的最后

在大家眼下说的数值运算,大家都是以子弹头的款式来的,可是bc那些就不一样样了 它能够拍卖小数~~~如下:

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

图片 4

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

是或不是感觉很便利的旗帜,接下去将BC用在命令行下边,完成运算

==、!=、= :相等,不对等, =代表相等于

[root@shell-yankerp ~]# echo 1 2 | bc 
3 
[root@shell-yankerp ~]# echo 1.5 1.5 | bc 
3.0 
[root@shell-yankerp ~]# echo 2*2 | bc 
4 
[root@shell-yankerp ~]# echo 8.5-8.5 | bc 
0 
[root@shell-yankerp ~]#  

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

运用BC配置变量运算

等等,这里就不说了 到末端实施中再见!

[root@shell-yankerp ~]# i=5  #设置变量 i=5 
[root@shell-yankerp ~]# i=`echo $i 5 | bc` 
[root@shell-yankerp ~]# echo $i  
10 
[root@shell-yankerp ~]#  

Shell编制程序之算术运占星令

依据bc具备的特种性质来来看,倘诺是小数,那么它管理是平昔不难题,如若是整数的话,那么就选择(()) let expr就好了。

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

2、使用awk完结总结

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

利用awk进行计算的成效很好,越发是管理小数,很可信如下:

expr :用于整数运算,但是还大概有别的功效

图片 5

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

剖析:第一行 echo 7.1 3.23 | 让awk处理 '{print 打印 $1 为7.1 - $2为3.23}'得出3.87

$[] :用于整数运算

第三行:echo 四 五 | 让awk举行管理 '{print  ($1为四那么在加肆等于八)最终*$贰 相当于乘5} ' 得出40

awk:awk既能够整数运算,也足以小数运算

$[]运算

declare: 定义变量值和性子,-i参数能够用来定义整形变量,做运算

[root@shell-yankerp ~]# a=5 
[root@shell-yankerp ~]# a=$[a 10] 
[root@shell-yankerp ~]# echo $a 
15 
[root@shell-yankerp ~]# echo $[2*3] 
6 
[root@shell-yankerp ~]# echo $[2/3] 
0 
[root@shell-yankerp ~]#  

首先眼观察这一个 以为很复杂,心乱,可是从未关联,稳步的就好了~~~

三、基于Shell变量输入read命令的运算

一、双小括号(()) 数值运占星令

read命令

双小括号的成效是进行数值运算与数值的比较,它的成效极高,用法很利索,是商城运营职员平常使用的操作符
((e=e 一)) 它的效益正是把e 一的结果赋值给变量e不过不得以用 echo ((e=e 一))来行使,但能够动用echo $((e=e 壹))
e=$((e=e 一)) 成效正是把e 一的实行结果赋值给变量e

Shell变量除了能够一直赋值或许脚本传参外,还能动用read命令从规范输入中获得,read命令为bash内置的,命令。

数值相比较

用法如下:

((八>七&&5==伍)) 用于数值从前的比较,用于标准剖断

-p 设置提醒音信

echo $((贰 一)) 用于直接出口运算表明式的结果,在(()) 后边加$符号

-t 设置输入的等待时间 如下:

案例一:双小括号"(())"数值运算实行

图片 6

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

浅析:上海教室使用了read命令 -t是输入等到时刻为10秒,那么-p便是一得之见的音讯,在后头大家加了 o p 相当于说,当用户输入内容时 他会把内容赋值给变量 o p;

就那样类推使用减号

如下:

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

图片 7

是或不是深感有些轻巧。那么接下去利用"(())"进行多少复杂的有个别归付钱术运算

例2:

[root@shell-yankerp sh]# ((a=1 2**3-4%3)) 
[root@shell-yankerp ~]# read -t 10 -p "请您输入内容:" o p 
请您输入内容:zhangsan lisi 
[root@shell-yankerp ~]# echo $o 
zhangsan 
[root@shell-yankerp ~]# echo $p 
lisi 
[root@shell-yankerp ~]#  

上述例子也正是说,首先a是3个变量名,那么在a=前边的一对总括的结果会赋值给a这几个变量,那么首先大家得知道前面包车型地铁图谋结果是有一点,在那几个变量中 大家用到了 号"**"以及"-"号包蕴“%”首先总括进度是这么的。先算乘除,后算加减

那大约正是read命令的主导用法了,然而本人在看书的光阴,开采那一章有过多的if语句和for循环实例,已经超先生出了有些读者的水准,经过自个儿的1对主张,结合在此之前的特别变量加数值计算总计出差不离的本子内容如下:

2**三 相当 二x二x贰=8 乘算出来现在算除。 四%叁=一 取模---- 八-壹=七 最后一 7=8最终结果为8 输出如下:

#!/bin/bash 
read -t 10 -p "请输入任意两个数值:" a b 

expr $a   1 &>/dev/null 
if [ "$?" -ne "0" ] 
 then 
  echo /bin/bash..$0 "请输入两个数字" 
  exit 1 
fi 
[ ${#a} -le 0 ] && { 
 echo "不能为空!!!" 
 exit 1 
} 
[ ${#b} -le 0 ] && { 
 echo "不能为空!!!" 
 exit 1 
} 

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))" 

图片 8

剖析:

例如2:

本文由68399皇家赌场发布于呼叫中心培训课程,转载请注明出处:Shell编程之运算,详解Shell编程之变量数值计算

关键词: 68399皇家赌场 编程语言 其它语言 Shell编程 shell

最火资讯