shell:数值运算、条件测试、if判断
bash-completion包:支持tab补齐数值运算:整数运算、小数运算
一、整数运算
1、expr
expr A + B,A和B之间要空格,否则直接显示A+B
expr A - B
expr A * B #乘法需要采用转义\,避免被作为shell通配符
expr A / B
\:只能屏蔽一个字符e.g:
# a=24
# echo \$a
$a
# echo $a
24
# echo \$a$b
$a
# echo \$a\$b
$a$b
2、$[]或$(())
举例:
# echo $
30
# echo $
3
# echo $
13
# echo $
7
# echo $
1
# x=3
# y=5
# echo $
8
可以一行进行多个运算
# x=8
# echo $,$
# 16,64
3、let运算 不回显结果
# x=9
# let x=x+8
# echo $x
17
4、特殊用法:
i=n
let i++ ---->i=n+1
let i-- ---->i=n-1
let i+=3 --->i=n+3
let i-=2 --->i=n-2
let i=2 --->i=n2
let i/=2 --->i=n/2
举例:
# i=24
# let i++
# echo $i
25
# let i+=3
# echo $i
28
# let i-=1
# echo $i
27
# let i*=2
# echo $i
54
# let i/=2
# echo $i
27
二、小数运算
scale=n控制小数点位数为n位
举例:
# bc
scale=5 #取小数点后保留5位
24/5.2555 #24除以5.2555
4.56659 #结果为4.56659
bc可做数值大小比较>、=、2" | bc
# 0
# echo "2>1" | bc
# 1
# A=12.5;B=24.8
# echo "$A>$B" | bc
0
bc非交互式运算
# echo 'scale=4;12.34*56.789;5/3' | bc #一行可以有多个命令,用分号;隔开!
700.7762
1.666
三、条件测试操作
1、字符串比较:==(判断两个字符串是否相当)、-z(字符串的值是否为空),-n(字符串的值是否不为空,相当于! -z)
举例:
判断当前用户是否为root
当root用户执行时:
# [ $USER == "root" ]
# echo $?
# 0
当普通用户执行时:
$ [ $USER == "root" ]
$ echo $?
$ 1
且&&,或||
一行中有多个命令,A命令和B命令
A;B #执行A,执行B
A&&B #执行A,仅当A成功才执行B
A||B #执行A,仅当A失败才执行B
举例:
[ a == a ] && echo "yes" || echo "no"
yes
[ a == b ] && echo "yes" || echo "no"
no
# [ a == a ]
# echo $?
# 0
# [ -z $A ] #判断A变量是否为空
# echo $? #查看0为真,非0为假
# a="abc" ; b="" #定义变量a的值为abc,b的值为空,注意:""里如果有空格也算不为空
# [ -z "$a" ] && echo "空值" || echo "非空值"
非空值
# [ -z $b ] && echo "空值" || echo "非空值"
空值
2、整数比较(不支持小数比较) -eq(等于)、-ne(不相等)、-gt(大于)、-ge(大于等于)、-lt(小于)、-le(小于等于)
举例:
# x=20
# [ $x -eq 20 ] && echo "相等" || echo "不相等"
相等
# [ $x -eq 30 ] && echo "相等" || echo "不相等"
不相等
提取当前登录此虚拟机的用户数,比较是否超过4
# who | wc -l
3 #统计用户数为3
# N=$(who | wc -l) #将统计的值赋给N
# [ $N --gt 4 ] && echo "超过了" || echo "没超过"
没超过
也可简化为:
# [ $(who | wc -l) -gt 4 ] && echo "超过了" || echo "没超过"
3、文件、目录判断
-e #判断是否存在(不管是文件还是目录)
-f #判断是否存在文件
-d #判断是否存在目录
-r #判断是否有r权限
-w #判断是否有w权限
-x #判断是否有x权限
举例:
# [ -e "/usr/src" ] && echo 存在 || echo 不存在
存在
判断对象是否为目录 -d,是否不为目录 ! -d
# [ -d "/usr/src/" ] && echo "是目录" || echo "不是目录"
是目录
# [ -d "/etc/fstab" ] && echo "是目录" || echo "不是目录"
不是目录
# [ -d "/home/nooby" ] && echo "是目录" || echo "不是目录"
不是目录
判断对象是否有-r、-w、-x权限
注意:r和w对root用户判断无效,无论是否设置权限,root都可读或写
举例:
# cp install.log /tmp/t.txt #复制一个文件做测试
# chmod -r /tmp/t.txt #去掉所有的r权限
# [ -r "/tmp/t.txt" ] && echo "可读" || echo "不可读" #root仍然可读
可读
切换为普通用户时:
$ [ -r "/tmp/t.txt" ] && echo "可读" || echo "不可读"
不可读
普通用户只对自己拥有r权限的对象,-r测试才成立
$ ls -l .bashrc
-rw-r--r-- 1 kobe kobe 124 09-24 16:44 .bashrc
$ [ -r ".bashrc" ] && echo "可读" || echo "不可读"
可读
-x权限:取决于文件本身,root或普通用户都适用
# chmod 644 /tmp/t.txt #设置无x权限
# ls -l /tmp/t.txt
-rw-r--r-- 1 root root 33139 12-11 10:52 /tmp/t.txt
# [ -x "/tmp/t.txt" ] && echo "可执行" || echo "不可执行"
不可执行
# chmod +x /tmp/t.txt #添加x权限
# [ -x "/tmp/t.txt" ] && echo "可执行" || echo "不可执行"
可执行
条件组合应用:
当前用户为root,且位于/root目录下
# [ $USER == "root" ]&&[ $PWD == "/root"]
# [ $? -eq 0 ]&& echo "YES"
YES
# [ ! -d "/xx" ]&& mkdir /xx #判断是否没有目录/xx,是就创建
# mount /dev/cdrom /xx #挂载
或
# [ -d "/xx" ]|| mkdir /xx #判断是否有目录/xx,没有就创建
# mount /dev/cdrom /xx
或
# [-d "/xx" ]&& mount /dev/cdrom /xx
每分钟检测当前计算机登录的用户数量
若数量大于2,则发送邮件报警
先写好脚本:
#!/bin/bash
user=$(who | wc -l)
[ $user -ge 2 ] && mail -s "登陆用户过多" root < /root/用户报警.txt
crontab -e -u root
/1 *bash 脚本名
if判断语句
1、单分支if(仅判断对)
if [ 判断 ];then
命令
fi
if [ 判断 ];then
成功
else
失败
fi
举例:
脚本:
#!/bin/bash
read -p '请输入您的IP:' ip
ping -c2$ip >&/dev/null #-c2是只ping2个包,-i0.1(缩短发送每个包的间隔时间为0.1秒),-W2(等待反馈是否ping通的超时时间2秒)
if [ $? -eq0 ];then
echo 通了!
else
echo 不通!
fi
2、多分支if
if [ 判断1 ];then
命令
elif [ 判断2 ];then
命令
... ...
else
命令
fi
举例:
$RANDOM(随机数)
$ 求余(因为余数不可能大于除数)设定随机数的范围1-10,不能用%11,因为有可能全部除尽余数为0
#!/bin/bash
x=$
read -p "我有个1-10的随机数,你猜:" cai
if [ $cai -eq $x ];then
echo 恭喜你,猜对了!
exit #必须要有!不然猜对了还会继续猜下去
elif [ $cai -gt $x ];then
echo 太大了
else
echo 太小了
fi
增加概率可以从read开始到最后多复制几遍
页:
[1]