一、 Shell脚本中变量的数值计算
1.1算数运算符
1.2运算操作符与运算命令
1.2.1 双小括号基础语法
[root@NAT1 ~]# echo $((7>8))
0 ----->0表示结果不成立,是错误的
[root@NAT1 ~]# echo $((9>8))
1 ----->1表示结果不成立,是正确的
[root@NAT1 ~]# n=1
[root@NAT1 ~]# echo $((n++))
1 ----->代表先输出n,再自增,所以这时输出n为1
[root@NAT1 ~]# echo $n
2 ----->这时n已经自加过了,所以n为2
[root@NAT1 ~]# echo $((++n))
3 ----->先自增,再输出n;
[root@NAT1 ~]# echo $n
3 ----->输出n为三
###########
++,--运算要注意,如果变量a是在运算符之前,输出表达式的值为a,然后变量a自增自减,如果变量a
是在运算符之后,输出表达式的值会先自增自减,表达式的值就是自增或自减后a的值
###########
#必须整数运算
[root@nebulalinux03 ~]# echo $((1+1))
2
[root@nebulalinux03 ~]# i=2
[root@nebulalinux03 ~]# echo $((i=1+2))
3
[root@nebulalinux03 ~]# echo $((1+2+3+4+5*1+4/2+5%3))
19
[root@nebulalinux03 ~]# a=2
[root@nebulalinux03 ~]# echo $((a=a+1))
3
[root@nebulalinux03 ~]# echo $((a+=1))
4
[root@nebulalinux03 ~]# echo $((a-=1))
3
[root@nebulalinux03 ~]# echo $((a**2))
9
给定两个值,进行算术运算:
[root@nebulalinux03 tmp]# vi test.sh
#!/bin/bash
#20190123
#little
#bc
#1.0
a=5
b=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))"
~
[root@nebulalinux03 tmp]# . test.sh
a-b=2
a+b=8
a*b=15
a/b=1
a**b=125
a%b=2
上面的例子我们改为以命令行传参的模式将两个变量值传给a和b,怎么实现呢?
[root@nebulalinux03 tmp]# vi test.sh
#!/bin/bash
#20190123
#little
#bc
#1.0
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@nebulalinux03 tmp]# . test.sh 5 2
a-b=3
a+b=7
a*b=10
a/b=2
a**b=25
a%b=1
ps:在执行脚本的时候,脚本后面的值可以当作脚本的参数来执行;
1.2.2 expr命令用法
expr命令是一个强大的计算命令,既可以做整数运算也可以做字符串匹配等运算,expr在计算时候直接使用数值和运算符进行计算 ;
[root@nebulalinux03 tmp]# expr 3 + 3
6
[root@nebulalinux03 tmp]# expr 3 * 3
expr: syntax error
[root@nebulalinux03 tmp]# expr 3 \* 3 # *号要惊醒转义
9
[root@nebulalinux03 tmp]# expr 3 / 3
1
[root@nebulalinux03 tmp]#
#运算符及数字之间需要有空格隔开,不然系统会默认当作一个字符串处理
#使用乘号*时,需要做转义
1.2.3 let运算命令用法
let运算符可以用来计算整数,和小双括号功能类似 ; let 运算表达式 等同于 ((运算表达式));
[root@nebulalinux03 tmp]# i=1
[root@nebulalinux03 tmp]# let i=i+2
[root@nebulalinux03 tmp]# echo $i
3
1.2.4 bc命令用法
bc是linux系统中的计算器 ;无法实现复杂计算;支持整数运算和小数运算
[root@nebulalinux03 tmp]# 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
2+2
4
3*3
9
4/4
1
2%2
0
2**2 #无法实现复杂计算
(standard_in) 5: syntax error
2*2*2
8
3.1+2.2
5.3 #支持整数运算和小数运算
[root@nebulalinux03 tmp]# echo 2+3|bc #命令行使用
5
[root@nebulalinux03 tmp]# echo 1.1+2.2|bc
3.3
[root@nebulalinux03 tmp]#
[root@nebulalinux03 tmp]# i=1 #搭配变量使用
[root@nebulalinux03 tmp]# i=`echo $i+1|bc`
[root@nebulalinux03 tmp]# echo $i
2
1.2.5 $[]运算
$[]只进行整数运算;
[root@nebulalinux03 tmp]# i=1
[root@nebulalinux03 tmp]# echo $[i+1]
2
[root@nebulalinux03 tmp]# echo $[3*3]
9
[root@nebulalinux03 tmp]# echo $[3%3]
0
[root@nebulalinux03 tmp]# echo $[3/3]
1
[root@NAT1 ~]# echo $[2.2+1]
-bash: 2.2+1: syntax error: invalid arithmetic operator (error token is ".2+1")
------------>非整数运算会报错
二、read命令用法实践
2.1 read命令基础
read命令用来从标准输入中获取变量值,read是bash内置命令。
Read可以带有-a, -d, -e, -n, -p, -r, -t, 和 -s八个选项。最常用的是p和t;
read [选项] [变量名]
选项说明:
-a 后跟一个变量,该变量会被认为是个数组,然后给其赋值,默认是以空格为分割符。
-d 后面跟一个标志符,其实只有其后的第一个字符有用,作为结束的标志。
-p 后面跟提示信息,即在输入前打印提示信息。
-e 在输入的时候可以使用命令补全功能。
-n 后跟一个数字,定义输入文本的长度,很实用。
-r 屏蔽\,如果没有该选项,则\作为一个转义字符,有的话 \就是个正常的字符了。
-s 安静模式,在输入字符时不再屏幕上显示,例如login时输入密码。
-t 后面跟秒数,定义输入字符的等待时间,等待时间超过,将继续执行后面的脚本。
-u 后面跟fd,从文件描述符中读入,该文件描述符可以是exec新开启的。
#基本读功能
[root@nebulalinux03 tmp]# read -t 5 -p "please input one number: " num
please input one number: 1
[root@nebulalinux03 tmp]# echo $num
1
[root@nebulalinux03 tmp]#
#read相当于通过交互式的方式获取变量的值然后赋值给变量
[root@nebulalinux03 tmp]# vi test.sh #修改之前脚本
#!/bin/bash
#a=$1
#b=$2
read -t 10 -p "input two numbers :" 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))"
echo "a%b=$(($a%$b))"
[root@nebulalinux03 tmp]# sh test.sh
input two numbers :2 3
a-b=-1
a+b=5
a*b=6
a/b=0
a**b=8
a%b=2
[root@nebulalinux03 tmp]#
2.2 综合案例
三、Shell脚本中的条件测试
在我们写脚本中,遇到最多的就是测试了,根据测试结果的不同来执行不同的代码段,执行条件测试一般我们都会返回“真”或者“假”,常见测试语法如下:
条件测试语法 | 说明 |
test <测试表达式> | 利用test进行条件测试的表达式,test和测试表达式直接至少需要有一个空格 |
[ <测试表达式 > ] | 通过[]小方括号来进行条件测试,[]的两个半括号和测试表达式直接至少需要一 个空格 |
[[ <测试表达式 > ]] | 通过双小方括号来进行条件测试,[[]]的两个半括号边界和测试表达式直接至少 需要一个空格 |
((<测试表达式 >)) | 通过双小括号进行条件测试,双小括号两个括号边界不需要和测试表达式空格 |
3.1 文件测试
(1)检查命令文件/bin/cp是否存在,如果存在则打印找到此文件,否则打印没找到此文件:
[root@NAT1 sh]# test -e /bin/cp && echo "The command $_ found." || echo "The command $_ not found."
The command /bin/cp found.
[root@NAT1 sh]# test -e /bin/cpdfdfd && echo "The command $_ found." || echo "The command $_ not found."
The command /bin/cpdfdfd not found.
注意:上述命令语句中的“$_”表示前一个执行的命令中的最后一个参数。
(2)检查文件/etc/resolv.conf是否存在,如果存在则打印找到此文件,否 则打印没找到此文件:
[root@NAT1 ~]# test -f /etc/resolv.conf && echo "The file $_ found." || echo "The file $_ not found."
The file /etc/resolv.conf found.
(3)检查目录/local是否存在:
[root@NAT1 ~]# test -d /local && echo "The directory $_ is exist." || echo "The directory $_ does not exist."
The directory /local does not exist.
(4)检查一个文件是否为特殊字符文件:
[root@NAT1 ~]# test -c /dev/zero && echo "The file $_ is a character special." || echo "The file $_ not a character special."
The file /dev/zero is a character special.
3.2 字符串测试
常用字符串操作 符 | 说明 |
-n "字符串" | 若字符串长度不为0则为真 |
-z "字符串" | 若字符串长度为0则为真 |
"串1" = "串2" | 若字符串1等于字符串2则为真,等号左右两边必须有空格,字符串需要加双 引号 |
"串1" != "串2" | 若字符串1不等于字符串2则为真 |
[root@NAT1 ~]# test -n "" ;echo $?
1 -------->字符串长度为0,结果为假
[root@NAT1 ~]# test -n "sda" ;echo $?
0 -------->字符串不为0,结果为真
[root@NAT1 ~]# test -z "" ;echo $?
0 -------->字符串为0,结果为真
[root@NAT1 ~]# test -z "qwe" ;echo $?
1 -------->字符串不为0,结果为假
[root@NAT1 ~]# test "abc" = "cde"; echo $?
1 -------->字符串不相等,结果为假
[root@NAT1 ~]# test "abc" != "cde"; echo $?
0 -------->字符串相等,结果为真
----------->1表示结果为假。0表示结果为真
3.2整数二元比较
注意:比较符号两端必须有空格 ;建议使用[]和test来进行测试;
[root@NAT1 ~]# test 5 -eq 5 && echo Yes || echo No
Yes
[root@NAT1 ~]# test 5 -ne 5 && echo Yes || echo No
No
[root@NAT1 ~]# test 5 -le 6 && echo Yes || echo No
Yes
3.3逻辑操作符
(1)逻辑与“&&”是一个布尔操作符。其语法如下所示:
command1 && command2
只有当command1返回一个退出状态码0时,command2才会执行。换句话说,就是只有当command1执行成功,才会执行command2。
(2)逻辑或“||”也是一个布尔操作符。其语法如下所示:
command1 || command2
只有当command1返回非0状态时,才运行command2。换句话说,就是只有当command1执行失败,才会执行command2。
[root@NAT1 ~]# test 5 -eq 5 -o 4 -eq 3
[root@NAT1 ~]# echo $?
0
优先级 ! a o 同级运算 从左到右 有括号先看括号内