shell的使用

shell   02

================================================

一,运算

加 减 乘 除 求模(取余数)

1,expr  可以运算并输出

expr 1 + 1   //加法运算,运算符号两边要加空格

expr 2 - 1

expr 2 '*' 2    //使用单引号屏蔽*的特殊功能即可实现乘法

expr 2 \* 2    //使用转义符号屏蔽*的特殊功能

expr 4 / 2   

expr 10 % 3

a=10

b=20

expr $a + $b    还能进行变量的运算

expr $a + 100

expr $a + $a

 

2,使用$[  ] 或者 $((  ))

echo $[1+1]

echo $[2-1]

echo $[2*2]

echo $[2/2]

echo $[2%2]

echo $[a+a]

 

3,使用let命令,不显示结果,通常用于变量的创建于自增减

功能一:let a=1+1   //变量的创建,然后可以用echo $a查结果

功能二:对变量进行自增减

常规写法                   主流写法

let a=a+1                  let a++     变量的自增减,将变量a的值加1

let a=a-1                     let a--      变量a减1

let a=a+2               let a+=2    变量a加2

let a=a-2                     let a-=2     变量a减2

let a=a*10                 let a*=10   变量a乘以10

 

4,使用bc计算器,可以进行小数运算

echo "1.1+1" | bc    //非交互的方式使用bc工具

echo "scale=3;10/3" | bc   //scale可以定义小数点后面的长度

 

------------------------------------------------------------

二,条件测试,可以为脚本赋予智能判断的效果

使用格式:1, test  表达式   2, [ 表达式 ]

测试方式:

  1. 对字符串进行测试

==  判断两边是否相等   !=  判断两边是否不等

  test a == a

test a == b 

[ a == a ]   //使用常量判断,再用echo $?测试结果

[ a == b ]   

[ $a == $b ]  //使用变量判断两个变量的值是否相等

[ $a != $b ]   //使用变量判断两个变量的值是否不相等

-z  判断变量是否为空    !  -z  判断变量是否非空

a=10

[ -z $a ]  //判断变量a是否为空,如果为空则判断正确

[ ! -z $a ]  //判断变量a中是否有值,有值则判断正确

 

  1. 逻辑符号

&&  之前指令执行成功才会执行之后指令

||   之前指令执行失败才会执行之后指令

 

#!/bin/bash

[ $USER == root ] ||  exit   //如果用户不是管理员就退出

[ $USER != root ] &&  exit   //效果同上,另一种写法

yum -y install vsftpd

systemctl restart vsftpd

systemctl enable vsftpd

 

#!/bin/bash

read -p "请输入用户名称:" n

[ -z $n ] && exit   //判断用户名为空的话就退出脚本

useradd $n

stty -echo

read -p "请输入密码:" m

echo

stty echo

echo "$m" | passwd --stdin $n

 

上述是1个逻辑符号的使用情况,但有时需求比较复杂可能需要2个逻辑符号组合,那么使用后效果可以按以下方式检测:

touch a b c

ls a  &&  ls b  &&  ls c  //结果是都显示,第一个ls执行成功,然后导致第二个ls也执

行,并且可以成功,这样的话第一个和第二个任务都成功了,那么这个组合就算成

功,然后会导致第二个逻辑符号&&后面的ls c 也执行并且成功。

ls a  ||  ls b  ||  ls c  //结果是显示a,第一个ls执行成功,第二个ls就不会执行了,这

两个任务中间是|| ,那么只要有一个成功就算这个组合执行成功,由于这个组合算

成功,所以就不会执行第二个||后面的任务了

ls a  &&  ls b  ||  ls c  //结果是显示a和b,第一个ls执行成功,然后导致第二个ls也

执行,并且可以成功,这样的话第一个和第二个任务都成功了,那么这个组合就算

成功,但是由于第二个逻辑符号是||,就不会执行最后的ls c任务了

ls a  ||   ls b  &&  ls c  //结果是显示a和c,第一个ls执行成功,第二个ls就不会执行

了,这两个任务中间是|| ,那么只要有一个成功就算这个组合执行成功,所以就会

导致第二个逻辑符号&&后面的ls c执行

 

再次修改脚本:

#!/bin/bash

read -p "请输入用户名称:" n

[ -z $n ] && echo "你倒是给个名字阿!" && exit   //退出前添加提示

useradd $n

stty -echo

read -p "请输入密码:" m

echo

stty echo

echo "$m" | passwd --stdin $n

 

  1. 数字

-eq 是否相等  -ne 是否不等   -gt 是否大于

-ge 是否大于等于  -lt  是否小于  -le  是否小于等于

[ 1 -eq 1 ]   //判断1是否等于1

[ 3 -ge 5 ]   //判断3是否大于等于5

a=10

b=20

[ $a -ne $b ]  //判断变量a是否不等于变量b

 

  1. 文件

-e  判断文件是否存在,不关心类型

-f  判断文件是否存在,必须是普通文件

-d  判断文件是否存在,必须是目录

-r  判断当前用户对文件是否有读权限,对root无效

-w 判断当前用户对文件是否有写权限,对root无效

-x  判断当前用户对文件是否有执行权限(目录是否可以进入)

 

----------------------------------------------------------------------------------

编写脚本,每2分钟检查服务器登录账户数量,如果超过3人

发邮件通知管理员

vim test01.sh

#!/bin/bash

n=$(who | wc -l)    //n里面存储了登录数量

[ $n -gt 3 ] && echo "服务器被入侵!可能牛老师来了!"  | mail -s test root

 //用n和3对比,如果超过3就发邮件

 

chmod  +x  test01.sh   //脚本写完后,赋予x权限

crontab -e      //编写计划任务

*/2  *  *  *  *  /opt/test01.sh    //每2分钟执行脚本,然后保存退出

只要目前超过3人登录系统,那么每隔2分钟就会收到邮件,使用mail命令

查看邮件

 

-----------------------------------------------------

虽然&&和||可以实现逻辑组合,但如果情况比较复杂就可能需要n多个&&或者||,会导致脚本难写,可读性差。此时就可以使用if分支

 

三,if分支

  1. 单分支

if 条件测试;then  //如果条件测试成功,那就执行下面的所有指令(指令可以有很多)

  执行指令   

fi

#!/bin/bash

if [ $USER == root ];then

    echo "你是管理员~"

fi

 

  1. 双分支

if 条件测试;then  //如果条件测试成功,就执行下面的所有指令(指令可以有很多)

           执行指令

         else

           执行指令  //如果上述条件测试失败,那就执行下面的指令

fi

 

#!/bin/bash

if  [ $USER == root ];then

echo "你是管理员~"

else

echo "你不是管理员~"

fi

 

---------------------------------------------------

ping -c 定义ping的次数   -i 定义ping的间隔时间(秒)

-W  ping失败时多久反馈结果

---------------------------------------------------

[root@svr7 opt]# cat test03.sh

#!/bin/bash

ping -c 3 -i 0.2 -W 1 $1 &> /dev/null

if [ $? -eq 0 ];then

    echo "通了!"

else

    echo "不通!"

fi

 

  1. 多分支

if 条件测试;then  //如果条件测试成功,就执行下面的所有指令(指令可以有很多)

执行指令

elif 条件测试;then   //如果条件测试成功,就执行下面的指令

         执行指令

elif 条件测试;then  //如果条件测试成功,就执行下面的指令

         执行指令

。。。。

else

执行指令  //如果上述条件测试失败,那就执行下面的指令

fi

 

练习:

#!/bin/bash

read -p "期末考试成绩如何?"  n

if [ $n -ge 90 ];then

    echo "优秀!"

elif [ $n -ge 80 ];then

    echo "良好!"

elif [ $n -ge 60 ];then

    echo "及格!"

else

    echo "晚上没饭了!"

fi

 

-----------------------------------------------------------------

四,循环

有时我们需要某个或者某群任务反复在服务器中执行很多次,就可以使用循环命

令写成脚本,而无需手工一次次执行

 

1,for循环,有次数的循环

for 变量名 in 值1 值2 值3 。。。。   //此处变量名可以自定义,通常习惯用i,值的多少决定了下面do与done之间的任务执行多少次,每个值之间有空格,这里是有3个值,所以就循环执行指令3次

do

循环任务

done

--------------------------------

#!/bin/bash

for i in  {1..100}    //执行100次任务的简略写法,但不支持变量

do

    echo ${i}abc

done

 

----------------------------------

#!/bin/bash

a=100

for i in $(seq $a)    //使用seq支持变量

do

    echo ${i}abc

done

 

--------------------------------------------

编写脚本,用ping命令测试192.168.4.1~192.168.4.15是否可以通

 

#!/bin/bash

for i in {1..15}

do

    ping -c 3 -i 0.2 -W 1 192.168.4.$i &> /dev/null

    if [ $? -eq 0 ];then

        echo "4.$i 通了!"

    else

        echo "4.$i 不通!"

    fi

done

-------------------------------------------

改良版:

#!/bin/bash

x=0

y=0

for i in {1..15}

do

    ping -c 3 -i 0.2 -W 1 192.168.4.$i &> /dev/null

    if [ $? -eq 0 ];then

        echo "4.$i 通了!"

                   let x++

    else

        echo "4.$i 不通!"

                   let y++

    fi

done

echo "$x台通了,$y台不通"

 

 

------------------------------------------------------------------------------

练习:

1,列出常见的整数值比较操作,并说明各自作用。

 

2,运用条件测试操作,检查当前的用户是否为root。

 

3,绘图描述if双分支结构的执行流程。

 

4,[ -z $abc ] && echo "yes" || echo "no" 可以实现什么测试效果。

 

 

参考答案

1,列出常见的整数值比较操作,并说明各自作用。

-eq 等于

-ne 不等于

-ge 大于等于

-le 小于等于

-gt 大于

-lt 小于

2,运用条件测试操作,检查当前的用户是否为root。

[ $USER == "root" ] && echo "yes" || echo no

3,绘图描述if双分支结构的执行流程。

if双分支结构判断一次条件,当条件成立时执行分支1、若不成立则执行分支2,如图-1所示。

图-1

4,[ -z $abc ] && echo "yes" || echo "no" 可以实现什么测试效果。

如果变量abc是空则显示yes,否则显示no

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值