脚本创建思路:

 
回顾:
1)Shell概述(种类、历史命令、输入输出、重定向、管道)
更改用户历史命令的数量:
# vim  /etc/profile
.. ..
HISTSIZE=1000
export  变量名=值
 
重定向操作:
< 、>、2>、&>、>>
屏蔽命令行输出/结果:
&>  /dev/null  
 
管道操作:
命令1 | 命令2 | 命令3
 
请思考:统计当前系统中使用/bin/bash的用户数量?
# grep  '/bin/bash'  /etc/passwd  |  wc  -l
或者
# grep  -c  '/bin/bash'  /etc/passwd
 
为什么要用脚本?
—— 偷懒(更简单、速度更快)
 
评估一条命令的执行时间:
# time  命令行
 
2)编写和执行Shell脚本
编写一个新文件
==》 整理脚本语句
方式1:按顺序编写任务实现命令
方式2:使用变量、循环/判断等控制接口来简化脚本
==》 添加x权限
 
3)Shell变量
自定义变量:
     变量名=变量值
     $变量名
   echo  $变量名
环境变量(env):
   PATH、PWD、USER、UID、HOME、SHELL、PS1、……
位置变量/参数:
      $1、$2、……、${10}、……
预定义变量:
      $0、$#、$*、$?
 
任务需求:
1. 识别当前主机中是否存在用户 ldapuser0
# id  ldapuser0
# echo  $?
2. 识别当前系统是否是64位的
# lscpu | grep x86_64
# echo  $?
 
export  变量1名=值  变量2名=值 ......
export  变量1名   变量2名 .. ..  
 
read  -p  '提示信息'  变量1名  变量2名
 
双引号、单引号、反撇号或$()
 
脚本创建思路:
==》 整理脚本语句
按顺序编写任务实现命令
==》 添加x权限
 
任务需求:
在server0上编写脚本 rhce_demo.sh,执行脚本后能完成以下任务
1. 自动部署好 Web 服务器
    网页来自 http://classroom/pub/materials/station.html
2. 自动调整好防火墙策略
    禁止网段172.34.0.0/24访问
    允许其他任何客户机访问
    实现端口转发 5423 ==> 80
 
验证脚本运行结果:
浏览器访问 http://server0.example.com:5423/
 
 
#!/bin/bash
#1. 自动部署好 Web 服务器
#    网页来自 http://classroom/pub/materials/station.html
yum  -y  install  httpd
wget  http://classroom/pub/materials/station.html  -O /var/www/html/index.html
systemctl  restart  httpd
systemctl  enable  httpd
 
#2. 自动调整好防火墙策略
#    禁止网段172.34.0.0/24访问
#    允许其他任何客户机访问
#    实现端口转发 5423 ==> 80
systemctl  restart  firewalld
systemctl  enable  firewalld
firewall-cmd  --set-default-zone=trusted
firewall-cmd  --permanent  --add-source=172.34.0.0/24  --zone=block
firewall-cmd  --permanent --zone=trusted  --add-forward-port=port=5423:proto=tcp:toport=80  
firewall-cmd  --reload
 
 
今日目标:
1)学会使用各种测试命令识别系统指标
2)通过if语句使脚本具备基本的判断能力
3)数值运算
Bash环境默认不支持小数运算
 
 
运算操作 ——
expr  数学表达式  ==》计算表达式并且显示结果
$[数学表达式]  ==》计算表达式并调用结果
取余数 ——
expr  整数1  %  整数2
 
特殊变量RANDOM,随机获得一个整数值 0~32767
 
任务需求:
1. 设置一个变量 X=12
2. 使用 expr 计算变量X的值 与 整数 5 的加减乘除余的结果
3. 使用 $[] 计算变量X的值 与 整数 5 的加减乘除余的结果
4. 利用随机整数变量RANDOM,通过运算获取一个1~33之间的整数
# echo  $[RANDOM%33+1]
 
 
福利彩票摇号  
CISHU=1
 
 
修改变量的值:
let   变量名++
 
 
小数运算
echo  "表达式"  |  bc
 
任务需求:
1. 定义两个变量 X=1234,Y=56.78
# X=1234
# Y=56.78
2. 使用let命令使变量X的值减小100,
# let  X-=100
3. 使用let命令使变量X的值增加1
# let  X++
4. 使用bc计算器计算出变量X减去Y的结果
# echo "$X-$Y"  | bc
 
 
检查用户ldapuser0是否存在?
# id  ldapuser0  &>  /dev/null
# ehco  $?
 
&&  而且
||  或者
 
代码简化 ==》
# id  ldapuser0  &>  /dev/null  &&  ehco  yes  ||  echo  no
 
任务需求:
1)识别目标主机 172.25.0.254 的连通性,能通 yes,否则 no
# ping  -c  4 172.25.0.254  &> /dev/null  &&  echo  yes ||  echo no
2)识别目标网站 http://server0.example.com/ 可用性,能访问 yes,否则 no
# wget http://server0.example.com/ &> /dev/null &&  echo  yes ||  echo no
 
 
 
逻辑测试 -- 逻辑与(而且):
命令1  &&  命令2
比方:要吃就吃好
有酒  &&  有菜  && 有主食
 
逻辑测试 -- 逻辑或(或者):
命令1  ||  命令2
比方:只要吃饱
米饭 ||  馒头
 
 
 
检查XX指标的操作 &&  命令A ||命令B
==》如果检查操作成功,那么执行命令A
==》否则,执行命令B
 
 
任务需求:
检查 httpd 进程是否在运行,是则 running,否则 halted
 
# pgrep  -x  httpd  &> /dev/null  &&  echo  running  ||  echo  halted
 
 
 
如何进行条件测试 —— 识别系统环境中的一些参数
方式1:任何一条命令行
方式2:
    test  -选项   参数
    test  参数1   -选项   参数2
       [    -选项   参数   ]  
       [    参数1   -选项   参数2   ]  
 
任务需求:
1)检查当前用户是否是root,是则显示"大王万岁",否则显示"小朋友你好"
# [ $USER == "root" ]   &&  echo  "大王万岁"  ||   echo  "小朋友你好"
2)检查当前登录的用户数量,如果不超过5个,那么显示OK
# [ $(who | wc -l) -le  5 ]  &&  echo  OK
3)检查当前运行的进程数量,如果超过100,发一封邮件给root
# [  $(pgrep  . |wc -l) -gt  100 ]  &&  echo "进程数太多"  | mail  -s  "服务监控警告"  root
4)检查 /media/cdrom 目录是否存在,报告结果
# [ -d  /media/cdrom ]  &&  echo yes  ||  echo  no
 
 
 
 
检查XX指标的操作 &&  命令A || 命令B
面临的问题:
   当需要执行的命令不止一条命令时,命令A、AA、AAA、AAAA
解决办法:
检查XX指标的操作 &&  命令A  &&  命令AA  && 命令AAA  &&  命令AAAA || 命令B
 
推荐使用 if 判断结构
 
 
如果  车子、房子、票子
那么
    下手
结束
 
if单分支结构,只需要一种处理
 
if  条件检测----车子、房子、票子
then
    处理XX事情的命令行操作....
fi
 
任务需求:使用if判断结构编写脚本,完成下列操作
1)检查当前运行的进程数量,如果超过100,发一封邮件给root
#!/bin/bash
if  [  $(pgrep  . |wc -l) -gt  100 ]
then
    echo "进程数太多"  | mail  -s  "服务监控警告"  root    
fi
 
2)检查 /media/cdrom 目录是否存在,若不存在,则创建此目录
#!/bin/bash
if  [ ! -d  /media/cdrom ]
then
    mkdir  -p  /media/cdrom
fi
 
 
 
if双分支结构,只需要两种不同处理
 
if  条件检测
then
    做第一种处理操作....
else
    做第二种处理
fi
 
任务需求:编写一个脚本,用来检查目标主机(由$1提供)的连通性
1)如果目标主机能ping通,显示 Host XXX is up
2)如果目标主机不能ping通,显示 Host XXX is down
3)如果执行脚本时未指定目标地址,那么显示正确的用法,退出脚本
#!/bin/bash
if  [ $#  -eq  0 ]
then
    echo  "用法: $0  目标主机地址"
    exit  1
fi
if  ping  -c3  -i0.2 -W1  $1  &> /dev/null
then
        echo  "Host  $1  is up"
else
        echo  "Host  $1 is down"
fi
 
 
if多分支结构,只需要三种或三种不同处理
if  条件检测1
then
    做第一种处理操作....
elif  条件检测2
then
    做第二种处理
else
    做第三种处理
fi
 
 
 
 
 
区分用户的论坛京豆等级(钻石plus、钻石、金牌、……)
成绩分档(超过90 优秀,70~90 良好,70以下 不合格)
 
 
任务需求:石头剪刀布
1)编写一个出拳脚本 chuquan.sh
2)执行此脚本以后,随机显示 石头、剪刀、布 当中某一个
 
#!/bin/bash
N=$[RANDOM%3+1]
if  [ $N -eq 1 ]
then
        echo  "石头"
elif  [ $N  -eq  2  ]
then
        echo  "剪刀"
else
        echo  "布"
fi
 
任务需求:石头剪刀布
1)编写一个猜拳脚本 chuquan.sh
2)对比用户、计算机的出拳结果,并显示输赢情况
 
实现思路:
#1)取得用户出拳结果($1)
#2)取得计算机出拳结果
#3)对比两个结果,并且显示输、赢、平情况
 
 
 
 
如何判断多个条件?
 
if   [[ 条件a  && 条件b ]]  ||  [[ 条件测试2  ]]  ||  [[ 条件测试2  ]]
 
if   [[ 用户==石头  && 计算机==剪刀  ]]  ||  [[ 用户==剪刀 && 计算机==布  ]] ||  [[ 用户==布  &&  计算机==石头  ]]  
 
 
 
#!/bin/bash
#1)取得用户出拳结果($1)
yonghu="$1"
#2)取得计算机出拳结果
N=$[RANDOM%3+1]
if  [ $N -eq 1 ]
then
        jisuanji="石头"
elif  [ $N  -eq  2  ]
then
        jisuanji="剪刀"
else
        jisuanji="布"
fi
#3)对比两个结果,并且显示输赢情况
if [ $yonghu == $jisuanji  ]  
then
    echo  平局
elif  [[ $yonghu == "石头"  && $jisuanji == "剪刀" ]]  ||  [[ $yonghu == "剪刀" &&  $jisuanji == "布"  ]] ||  [[ $yonghu == "布"  &&  $jisuanji == "石头" ]]
then
    echo  你赢了
else
    echo  你输了
fi
 
 
总结:
1. 数值运算(加减乘除余的$[]、let控制变量值)
2. 条件测试(字符串、整数值、文件状态)
3.if选择结构(单分支、双分支 > 多分支)
    参考案例里"论坛积分分档"
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值