shell 2

ps aux
查看进程数量
-------------------------------------
$RANDOM

整数 expr $[a+b] $(()) let x=a+b
小数 echo "scale=2;1.1+2.2" | bc

测试判断
test 表达式 #[表达式]
test a==a
echo $?

字符串判断 == != -z ! -z
数字判断 -eq -ne -gt -ge -lt -le
文件或目录 -r -w -x -e -f -d

[表达式]&&命令1 || 命令2
命令少的时候,可以用这个
这个用法命令多了,就不合适了,最好用if

num=`ps aux | wc -l `
[$num -gt 250 ] && mail <

[ ! -d /media/usb ] && mkdir /media/usb
[ -d /media/usb ] || mkdir /media/usb
---------------------------------
if [ 表达式 ] ;then #[]一定要空格,而且里面的等号2边也要有空格
命令1
fi
----------------------------------
if [ 表达式 ] ;then
命令1
else
命令2
fi
----------------------------------------
if 多分支

if [ 测试1 ] ;then
命令1
elif [ 测试2 ] ;then
命令2
elif [ 测试3 ] ;then
命令3
...
else
其他命令
fi
-------------------------------------
if后面不一定跟表达式,可以是任何命令,它只关心对不对

if ping -c1 192.168.4.5 >/dev/null ;then
echo "up"
else
echo "down"
fi
---------------------------------------
ping -c1 192.168.4.5 上面写命令
if [ $? -eq 0 ]>/dev/null ;then
echo "up"
else
echo "down"
fi
------------------------------------
取余
除以什么数,余数肯定小于那个数

如一个数除以10,那么余数肯定小于10
--------------------------------------
expr 整数的运算

乘法操作应采用 \* 转义,避免被作为Shell通配符;
参与运算的整数值与运算操作符之间需要"以空格分开",引用变量时必须"加$符号"。
首先定义变量a=12,然后分别计算与2的加减乘除和取余运算结果:

# a=12 #定义变量a
# expr $a + 2
14
# expr $a - 2
10
# expr $a \* 2 #乘法*,应在前面添加反斜杠 \ ,取消通配符特殊含义
24
# expr $a / 2
6
# expr $a % 2 #取余。12除以2,余数为0
0
# expr $a % 5 #取余。12除以5,余数为2
2
---------------------------------------
或者可以直接和常量一起用,无需定义变量

# expr 12 + 2
14
[root@server0 ~]# expr 12 - 2
10
[root@server0 ~]# expr 12 \* 2
24
[root@server0 ~]# expr 12 / 2
6
[root@server0 ~]# expr 12 % 2
0
[root@server0 ~]# expr 12 % 5
2
----------------------------------------
$[] 整数的运算

乘法操作 * "无需转义",运算符两侧可以"无空格";引用变量"可省略 $ 符号";
计算结果替换表达式本身,可"结合echo命令"输出。
首先定义变量a=12,然后分别计算与2的加减乘除和取余运算结果:

# a=12
# echo $[a+2]
14
# echo $[a-2]
10
# echo $[a*2]
24
# echo $[a/2]
6
# echo $[a%2]
0
# echo $[a%5]
2
---------------------------------------
或者可以直接和常量一起用,无需定义变量

# echo $[12+2]
14
# echo $[12-2]
10
# echo $[12*2]
24
# echo $[12/2]
6
# echo $[12%2]
0
# echo $[12%5]
2
-----------------------------------------
let 整数的运算

expr 或 $[] 只进行运算,并不会改变变量的值;
而let命令可以直接对变量值做运算再保存新的值。
因此变量a=12,在执行let运算后的值会变更;
另外,let运算操作并不显示结果,但是可以结合echo命令来查看:

#a=12
# let a+=2 #a+=2(a=a+2)
# echo $a
14
# let a-=2 #a-=2(a=a-2)
# echo $a
12
# let a*=2 #a*=2(a=a*2)
# echo $a
24
# let a/=2 #a/=2(a=a/2)
# echo $a
12
# let a%=5 #a%=5(a=a%5)
# echo $a
2
----------------------------------------
a=12
# let a++;echo $a #a++(a=a+1) 可以用;连续执行2个命令
13
# let a--;echo $a #a--(a=a-1)
12
-----------------------------------------
bc 小数的运算 ,交互式运算

执行bc命令进入交互环境,然后再输入需要计算的表达式。
bc不好的地方在于它是交互的,脚本里不能用交互的。
-------------------------------------------
bc 非交互式运算

一般是和echo还有管道 | 操作交给bc运算。
注意,小数位的长度可采用scale=N限制,除此以外也受参与运算的数值的小数位影响。

scale=2 #表示取小数点后面的2个数
quit #退出交互计算器
-------------------------------------------
# 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'.
2/10
0
scale=2 #表示取小数点后面的2个数
2/10
.20
scale=1 #表示取小数点后面的1个数
2/10
.2
1.1+1.1
2.2
1.1-0.2
.9
1.1*0.2
.2
1.1/0.2
5.5
quit #退出交互计算器
-----------------------------------------------------------------
用 ; 来把多个计算公式隔开

# echo "1.1+2" | bc
3.1
# echo "1.1*2" | bc
2.2
# echo "scale=2;1.1*2" | bc
2.2
# echo "scale=2;1.1/2"
scale=2;1.1/2
# echo "scale=2;1.1/2" | bc
.55
# echo "scale=2;1.1+1.1" | bc
2.2
----------------------------------------------------------------
在bc中,1代表对,0代表错。和echo $? 正好相反。

# echo "1>2" | bc
0
# echo "3>2" | bc
1
# echo "1<2" | bc
1
# echo "1==2" | bc
0
# echo "1==1" | bc
1
------------------------------------------------------------------
字符串测试
整数值比较
识别文件/目录的状态
--------------------------------------------------------------------
字符串测试

== 比较两个字符串是否相同
检查当前用户是否为root。$?为0,对。1是错。

当root用户执行时:
[ $USER == root ]
[root@server0 ~]# echo $?
0

当普通用户执行时:
[root@server0 ~]# su - haha
[haha@server0 ~]$ [ $USER == root ]
[haha@server0 ~]$ echo $?
1
---------------------------------------------------
!= 比较两个字符串是否不相同

当普通用户执行时:
[haha@server0 ~]$ [ $USER != root ]
[haha@server0 ~]$ echo $?
0

当root用户执行时:
[root@server0 ~]# [ $USER != root ]
[root@server0 ~]# echo $?
1
--------------------------------------------------------------------
一行执行多条命令的情况

# A && B #仅当A命令执行成功,才执行B命令
给定条件必须都成立,整个测试结果才为真。
# A || B #仅当A命令执行失败,才执行B命令.
只要其中一个条件成立,则整个测试结果为真。
# A ; B #执行A命令后执行B命令,两者没有逻辑关系
# A && B || C #什么时候执行C?
当A是错的,B不执行,所以执行C
或者,当A是对的,B是错的,所以执行C

# [ a == a ] && echo Y || echo N
Y
# [ a == b ] && echo Y || echo N
N
# [ a != a ] && echo Y || echo N
N
------------------------------------------------------------
-z 检查变量的值是否未设置(空值)

# [ -z $NB ] && echo Y || echo N #判断变量NB是不是空
Y
# NB=xiezi
# [ -z $NB ] && echo Y || echo N
N
# [ ! -z NB ] #测试NB是否为非空
# echo $?
0
# [ ! -z NB ] && echo "非空" || echo "空"
非空
# echo $NB
xiezi
-------------------------------------------------------------
#[ ! -z $NB ] && echo Y || echo N

在前面加上 ! 代表"非"
即,如果$NB的值不为空

# [ ! -z NB ] && echo Y || echo N
Y
注意这条命令和上条命令的区别一个是 $NB,一个是 NB

还有一个-n可以测试变量是否不为空(相当于! -z)
--------------------------------------------------------------
解释

#!/bin/bash
[ $USER != root ] && exit #如果当前用户不是root,就退出这个脚本
read -p "请输入用户名:" user
[ -z $user ] && echo "未输入用户名" && exit #如果未输入用户名,即用户名为空,就输出提示信息,并退出
stty -echo
read -p "请输入密码:" pass
stty echo #显示输出的命令,这个一定要在之前设置!
[ -z $pass ] && echo "未输入密码" && exit #如果未输入密码,即密码为空,就输出提示信息,并退出!
useradd $user
echo $pass | passwd --stdin $user
--------------------------------------------------------------
#!/bin/bash
[ $USER != root ] && exit
read -p "请输入用户名:" user
[ -z $user ] && echo "未输入用户名" && exit
stty -echo
read -p "请输入密码:" pass
stty echo
[ -z $pass ] && echo "未输入密码" && exit
useradd $user
echo $pass | passwd --stdin $user
------------------------------------------------------------
整数值比较

-eq equal 等于
-ne not equal 不等于
-gt greater than 大于
-ge great or equal 大于等于
-lt less than 小于
-le less or equal 小于等于
------------------------------------------------------------
参与比较的必须是整数(可以调用变量),比较非整数值时会出错:

c=10.1
# [ $c -eq 10 ] #不支持小数比较, 比较非整数值时会出错
-bash: [: 10.1: 期待整数表达式
# e=20
# [ $e -eq 10 ]
# echo $?
1
------------------------------------------------------------
-eq 比较两个数是否相等。

# r=20
# [ $r -eq 20 ] && echo "相等" || echo "不相等"
相等
# [ $r -eq 30 ] && echo "相等" || echo "不相等"
不相等
------------------------------------------------------------
-ne 比较两个数是否不相等。

# r=20
# [ $r -ne 20 ] && echo "不相等" || echo "相等"
相等
# [ $r -ne 30 ] && echo "不相等" || echo "相等"
不相等
------------------------------------------------------------
-gt 比较前面的整数是否大于后面的整数。

r=20
# [ $r -gt 10 ] && echo "大于" || echo "否"
大于
# [ $r -gt 20 ] && echo "大于" || echo "否"

# [ $r -gt 30 ] && echo "大于" || echo "否"

------------------------------------------------------------
-ge 比较前面的整数是否大于或等于后面的整数。

# r=20
# [ $r -ge 10 ] && echo "大于或等于" || echo "否"
大于或等于
# [ $r -ge 20 ] && echo "大于或等于" || echo "否"
大于或等于
# [ $r -ge 30 ] && echo "大于或等于" || echo "否"

------------------------------------------------------------
-lt 比较前面的整数是否小于后面的整数。

# r=20
# [ $r -lt 10 ] && echo "小于" || echo "否"

# [ $r -lt 20 ] && echo "小于" || echo "否"

# [ $r -lt 30 ] && echo "小于" || echo "否"
小于
-----------------------------------------------------------
-le 比较前面的整数是否小于或等于后面的整数。

# r=20
# [ $r -le 10 ] && echo "小于或等于" || echo "否"

# [ $r -le 20 ] && echo "小于或等于" || echo "否"
小于或等于
# [ $r -le 30 ] && echo "小于或等于" || echo "否"
小于或等于
----------------------------------------------------------
提取当前登录的用户数,比较是否大于等于3。

# who | wc -l #确认已登录的用户数
4
# N=$(who | wc -l) #赋值给变量N
# [ $N -gt 3 ] && echo "超过了" || echo "没超过"
大于或等于3个人

上述赋值给变量N及与3比较的操作,可以简化为如下形式:
# [ $(who | wc -l) -gt 3 ] && echo "超过了" || echo "没超过"
超过了
------------------------------------------------------------
每分钟判断当前登陆的用户是否大于等于3个,如果有,则发邮件给root

vim /root/user.sh
#!/bin/bash
[ $(who | wc -l) -gt 3 ] && echo "当前登陆的用户太多了" | mail -s "warning" root

crontab -e -u root
* * * * * /root/2.sh

chmod +x /root/mail.sh
mail
测试
------------------------------------------------------------
-e exist 存在(不管是目录还是文件)
-f file 存在且为文件
-d directory 存在且是目录
-r read
-w write
-x execute
-----------------------------------------------------------
以实际操作结果为原则

chmod -r
chmod -w

ll看都没有权限了,但是root依然可以看和写,所以是正确的
但是chmod -x
root也没有执行权限
------------------------------------------------------------
if 单分支

if 条件测试 ;then
命令序列
fi
----------------------------------
if 双分支

if 条件测试 ;then
命令序列1
else
命令序列2
fi
----------------------------------------
if 多分支

if 条件测试1 ;then
命令序列1
elif 条件测试2 ;then
命令序列2
else
命令序列n
fi
----------------------------------------------------------------------------
检测/media/cdrom目录,若不存在则创建

# vim /root/mkdir.sh
#!/bin/bash
if [ ! -d /media/cdrom ] ; then
mkdir -p /media/cdrom
fi

chmod +x /root/mkdir.sh
-------------------------------------------------------
ll 查看
c 键盘鼠标 属于字符设备,按顺序写的
b 硬盘 属于块设备,想往硬盘写文件,哪里有空就往哪里写,它是随机存的。就像停车场,有空间就可以停在哪里,不一定按顺序
写脚本,挂载硬盘一定要写-e,不能写-f,因为它不是文件。只要判断是否存在即可。
p 是piple,管道 |
------------------------------------------------------
检测并判断指定的主机是否可ping通

使用ping命令检测目标主机时,人工可直接判断反馈结果,而脚本却不方便。

但是当ping成功时,$?的值为0;
而ping测试失败时,$?的值不为0。
因此在Shell脚本中可以利用这一点来判断ping目标主机的成败。

为了节省ping测试时间,
可以只发送3个测试包(-c 3)、
缩短发送测试包的间隔秒数(-i 0.2)、
等待反馈的超时秒数(-W 1)。

# vim /root/ping.sh
#!/bin/bash
ping -c1 -W1 $1 &>/dev/null
if [ $? -eq 0 ];then
echo "$1 is up"
else
echo "$1 is down"
fi
--------------------------------------------------
# cat /root/shuzi.sh
#!/bin/bash
num=$[RANDOM%10+1]
read -p "我有一个随机数,你猜:" guess
if [ $guess -eq $num ];then
echo "恭喜你猜对了"
exit
elif [ $guess -lt $num ];then
echo "猜小了"
else
echo "猜大了"
fi
read -p "我有一个随机数,你猜:" guess
if [ $guess -eq $num ];then
echo "恭喜你猜对了"
exit
elif [ $guess -lt $num ];then
echo "猜小了"
else
echo "猜大了"
fi
read -p "我有一个随机数,你猜:" guess
if [ $guess -eq $num ];then
echo "恭喜你猜对了"
exit
elif [ $guess -lt $num ];then
echo "猜小了"
else
echo "猜大了"
fi
------------------------------------------------------
随机输入3个数,对比哪个最大?

# cat /root/zuida.sh
#!/bin/bash
read -p "请输入3个数:" n1 n2 n3
if [ $n1 -gt $n2 ];then #如果n1大
if [ $n1 -gt $n3 ];then 看看n1和n3谁大
echo "$n1最大"
else
echo "$n3最大"
fi
else #否则n2大
if [ $n2 -gt $n3 ];then 看看n2和n3谁大
echo "$n2最大"
else
echo "$n3最大"
fi
fi
-------------------------------------------------------
# cat /root/zuida.sh
#!/bin/bash
read -p "请输入3个值:" n1 n2 n3
if [ $n1 -gt $n2 ];then
if [ $n1 -gt $n3 ];then
echo "$n1最大"
else
echo "$n3最大"
fi
else
if [ $n2 -gt $n3 ];then
echo "$n2最大"
else
echo "$n3最大"
fi
fi

转载于:https://www.cnblogs.com/summer2/p/10788020.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值