摘自:Oldboy Linux运维——SHELL编程实战

利用(())双括号进行比较及判断:

[root@yeebian ~]# echo $((3<8))
1 #1表示真。
[root@yeebian ~]# echo $((8<3))
0 #0表示假。
[root@yeebian ~]# echo $((8==8))
1
[root@yeebian ~]# if ((8>7&&5==5))
> then
> echo yes
> fi
yes

上面涉及的数字及变量必须为整数(整型),不能是小数(浮点数)或字符串。

在变量前后使用--和++特殊运算符的表达式。

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

有关++、--运算的记忆方法:

变量a在运算符之前,输出表达式的值为a,然后a自增或自减;变量a在运算符之后,输出表达式会先自增或自减,表达式的值就是自增或自减后a的值。

各种(())运算的Shell脚本示例。

[root@yeebian ~]# vim test.sh
testchars
#!/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@yeebian ~]# bash test.sh
a-b=4
a+b=8
a*b=12
a/b=3
a**b=36
a%b=0

由此延伸的脚本:

[root@yeebian ~]# vim 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@yeebian ~]# bash test.sh 10 5
a-b=5
a+b=15
a*b=50
a/b=2
a**b=100000
a%b=0

计算字符串长度:

[root@yeebian ~]# char="I am studying Shell."
[root@yeebian ~]# expr length "$char"
20
[root@yeebian tmp]# echo ${#char}
20
[root@yeebian tmp]# echo $char | wc -L
20
[root@yeebian tmp]# echo $char | awk '{print length($0)}'
20

其中echo ${#char}这种方式是最快的。

expr实践

判断参数个数是否为2,若不是,则给出提示终止运行;

判断传入的参数是否为整数,若不是,则给出提示终止运行;

做运算。

[root@yeebian vurtne]# vim shell.sh
#!/bin/bash
[ $# -ne 2 ]&&{
echo $"USAGE $0 NUM1 NUM2"
exit 1
}
a=$1
b=$2
expr $a + $b + 110 &>/dev/null
if [ $? -ne 0 ]
then
echo "You must input two nums."
exit 2
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@yeebian vurtne]# bash shell.sh 1 q
You must input two nums.
[root@yeebian vurtne]# bash shell.sh 0
USAGE shell.sh NUM1 NUM2
[root@yeebian vurtne]# bash shell.sh 8 2
a-b=6
a+b=10
a*b=16
a/b=4
a%b=0
a**b=64

通过一条命令计算输出1+2+3+...+10的表达式,并计算结果:

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

awk计算

[root@yeebian ~]# echo "7.7 3.8" | awk '{print ($1-$2)}'
3.9
[root@yeebian ~]# echo "358 113" | awk '{print ($1-3)/$2}'
3.14159
[root@yeebian ~]# echo "3 9" | awk '{print ($1+3)*$2}'
54

read命令实践

[root@yeebian vurtne]# vim shell.sh
#!/bin/bash
read -p "Please input two num:" 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,please 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@yeebian vurtne]# bash shell.sh
Please input two num:1 qq
One of the num is not num,please input again.
[root@yeebian vurtne]# bash shell.sh
Please input two num:qq
The second num is null
[root@yeebian vurtne]# bash shell.sh
Please input two num:5
The second num is null
[root@yeebian vurtne]# bash shell.sh
Please input two num:5 6 7
One of the num is not num,please input again.
[root@yeebian vurtne]# bash shell.sh
Please input two num:5 7
a-b=-2
a+b=12
a*b=35
a/b=0
a%b=5
a**b=78125

SHELL (4) —— 变量的数值计算实践的更多相关文章

  1. shell基础--变量的数值计算

    变量的数值计算 1.$((表达式)) (1).实验1 [root@~_~ day4]# cat test.sh #!/bin/bash a=6 b=2 echo "a-b=$(($a-$b) ...

  2. shell 变量的数值计算实践 expr

    expr(evaluate(求值)expressions(表达式))命令既可以用于整数运算,也可以用于相关字符串长度.匹配等的运算处理 expr 用做计算 必须有一个空格才会计算 [root@salt ...

  3. shell编程——变量的数值计算

    在shell脚本中,有时候会需要对数值类型的变量进行计算,通常我们用的是(()) [root@localhost collect]# ((a=1+2)) [root@localhost collect ...

  4. Shell特殊变量介绍与实践 $0

    2.$0特殊变量的作用及变量实践$0的作用为取出执行脚本的名称(包括路径) ,下面是该功能的实践.范例4-4:获取脚本的名称及路径. [root@salt-client- sh1]# cat n1.s ...

  5. shell下变量比较最佳实践

    https://stackoverflow.com/questions/13617843/unary-operator-expected If you know you're always going ...

  6. shell与变量的声明的操作

    1.给命令起别名:alias 执行下面命令后,可以使用dir代替ls –l 命令,显示目录中的文件详细信息: 还可以用一个别名表示几个命令 的结合: 2.ps:显示当前登录会话的所有活动进程: 3.更 ...

  7. shell之变量与read

    环境变量 set 环境变量可供shell以外的程序使用 shell变量 env shell变量仅供shell内部使用 set:显示(设置)shell变量 包括的私有变量以及用户变量,不同类的shell ...

  8. 【Linux】之shell特殊变量整理

    目录 1. 特殊变量列表 2. 特殊说明 在shell中变量名只能包含数字.字母和下划线,因为某些包含其他字符的变量有特殊含义,这样的变量被称为特殊变量. 例如,$ 表示当前Shell进程的ID,即p ...

  9. (转载)shell变量基础—shell自定义变量

    (转载)http://see.xidian.edu.cn/cpp/html/1494.html 一.Shell定义变量需要遵循的规则 Shell编程中,使用变量无需事先声明,同时变量名的命名须遵循如下 ...

随机推荐

  1. html元素双击事件触发机制猜想及疑惑

    今天有个同事遇到一个奇怪的问题,我照着他的代码做了一些简化写了这个demo <!DOCTYPE html> <html> <head> <style type ...

  2. 前端菜鸟起飞之学会ps切图

    由于之前只顾着追求效率,没有学习过PS,但其实这是前端开发人员需要学会的技能之一,曾经看过一个大佬的前端经验分享说他在招聘时遇到不会切图的会直接pass掉,可见前端开发人员学会切图是多么重要.通过观看 ...

  3. Hyperledger Fabric v1.1.0安装记录(国内源版)

    1. 安装虚拟机     虚拟机软件采用:VirtualBox     操作系统选择:Ubuntu 14.04     内存:4G     CPU:2核     硬盘:20G     2.(可选)更改 ...

  4. ping命令使用及其常用参数

    PING (Packet Internet Groper),因特网包探索器,用于测试网络连接量检查网络是否连通,可以很好地帮助我们分析和判定网络故障.Ping发送一个ICMP(Internet Con ...

  5. es6箭头函数使用场景导致的一些问题

    1. 今天在使用draggable组件时,监听dragmove事件时获取到的事件对象有一些异常, 代码如下 draggable.on('drag:move', (event) => { cons ...

  6. PAT甲题题解-1017. Queueing at Bank (25)-模拟

    有n个客户和k个窗口,给出n个客户的到达时间和需要的时长有空闲的窗口就去办理,没有的话就需要等待,求客户的平均时长.如果在8点前来的,就需要等到8点.如果17点以后来的,则不会被服务,无需考虑. 按客 ...

  7. What is the difference between WinRT, UWP and WPF?

    在学习UWP的过程中确实有这个迷惑,在此分享一下. UWP (Universal Windows platform), Metro and WinRT are all result of Micros ...

  8. redisCluster数据持久化

    Redis的数据回写机制 Redis的数据回写机制分同步和异步两种, 同步回写即SAVE命令,主进程直接向磁盘回写数据.在数据大的情况下会导致系统假死很长时间,所以一般不是推荐的. 异步回写即BGSA ...

  9. Oracle与SQLSERVER修改数据文件的路径

    1. SQLSERVER ALTER DATABASE CWBASEMSS modify file (name = cwbasemss_dat ,filename = 'c:\cwdata\mss\C ...

  10. RANCHER2.0 的简单使用

    1. RANCHER2.0  能够管理 k8s 集群 也能够用来搭建 k8s 集群 但是因为网络问题 只测试了如何去管理集群 还没有去 测试 安装集群. 2. 创建rancher 服务的方法 dock ...