【Linux】shell编程2(算数运算符、算术操作符、运算命令、(())、expr命令用法、let、bc、$[]、read命令、Shell条件测试 、文件测试、字符串测试、整数二元比较、逻辑操作符)

一、 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 同级运算 从左到右 有括号先看括号内
  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

LKsTaRt~

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值