循环结构 case分支 Shell函数


回顾:
1)循环结构
—— for列表式循环
for  变量名   in  值1  值2 .. ..
do
    针对 $变量名 处理操作
done

for ((i=1;i<=10;i++))
do
    。。 。。
done


—— while条件式循环             【until】
while  满足XX条件时
do
    处理操作命令...
done

i=1
while  变量i的值满足XX条件时
do
    处理操作命令...
    let  i++
done

2)case分支 —— 在变量值等于不同的情况时做不同操作
case  变量值  in
值1)
      命令操作1 .. ..
      ;;
值2)
      命令操作2 .. ..
      ;;
*)
     默认的命令操作
esac

3)Shell函数 —— 就是使用固定的名称来存放一批命令行
变量、命令别名、脚本、函数/内部命令

函数名() {
    命令操作1
    命令操作2  $1
    .. ..
}
函数名
函数名  参数1  参数2

4)脚本的中断和退出
exit 退出值 —— 直接放弃剩余的所有操作,直接退出脚本
continue —— 放弃本次循环剩余的操作,继续下一次循环
break —— 放弃整个循环,继续执行done之后的操作


任务需求:编写一个机房巡检脚本 chkidc.sh
1)脚本在执行时需要提供一个文件作参数,这个文件内包含需要被检查的服务器IP地址列表
2)如果没有提供参数,应该提示正确用法,并退出脚本
3)正常操作为检查列表中每一台主机是否存活(ping通),只列出不存活的主机IP

!!!! 位置参数 # ./chkidc.sh  idc1.txt
!!!! 提前 if 检查是否给参数,。。。。 exit
!!!! 使用for循环去取得文件内的每一个IP地址,通过 ping 检查
!!!! 如果能通 continue,否则列出不通的主机地址


#!/bin/bash
if  [ $#  -eq  0 ]
then
    echo  "Usage:$0  <IP_LIST_FILE>"
    exit 1
fi
echo "以下服务器已失联:"
for  ip  in  $(cat  $1)
do
    if  ping  -c3 -i0.2  -W1  $ip  &> /dev/null
    then
        continue
    else
        echo $ip
    fi
done


今日目标:
1)字符串处理(系统指标提取/生成/配置内容替换)
2)扩展脚本技巧(Shell数组、expect交互登录)
3)正则表达式(用特殊的符号来表示不确定的字符串)


pgrep  .


任务需求:
1)提取/etc/selinux/config文件的 ^SELINUX= 行保存到变量 A
2)用三种不同方法截取变量A的前7个字符、=号之后的所有字符

# A=$(grep  ^SELINUX=  /etc/selinux/config)

云服务器(虚拟机)的虚拟网卡的地址

任务需求:
1)生成一个随机的8位密码字串
# uuidgen | cut  -b -8
2)编写脚本 /sbin/macgen,执行此命令后能生成一个mac地址,这个mac地址的前3组为 52:54:00,后3组要随机生成

echo  "52:54:00:xx:yy:zz"

#!/bin/bash
echo  "52:54:00:$(uuidgen |cut -b -2):$(uuidgen |cut -b -2):$(uuidgen |cut -b -2)"

字符串拼接方式:
#!/bin/bash
XX="52:54:00"
for i in 1 2 3
do
    XX="$XX:$(uuidgen | cut -b -2)"
done
echo $XX

路径分割:
dirname  文档路径     —— 取得文档的存放位置
basename   文档路径     —— 取得文档的基本名称

vim编辑器的末行替换操作
:s /old/new/
:s /old/new/g

字串替换:
${var/old/new}
${var//old/new}


键盘上 # 在 % 左边
字串砍头:
${var#*关键词}
${var##*关键词}          【贪婪模式】
字串剁脚:
${var%关键词*}
${var%%关键词*}          【贪婪模式】

任务需求:
1)提取server0上Web服务的网页目录配置,保存到变量webroot
# webroot=$(grep ^DocumentRoot /etc/httpd/conf/httpd.conf)
2)采用剁脚方式处理变量webroot,把网页目录改成 /tedu
# echo "${webroot%% *} /tedu"
3)采用字串替换方式处理变量webroot,把网页目录改成 /tedu
# echo ${webroot/"/var/www/html"/"/tedu"}
4)采用砍头方式处理变量webroot,只保留目录部分
# echo ${webroot#* }
5)编写脚本ren1.sh,将当前目录下的 .txt文件的扩展名改为 .text
6)编写脚本ren2.sh,将当前目录下的 .text文件的扩展名改为 .txt
#!/bin/bash
for FILE  in  *.text
do
    mv  $FILE  ${FILE%.text*}.txt
done

7)编写脚本ren3.sh,将当前目录下的 $1 文件的扩展名改为 $2
#!/bin/bash
for FILE  in  *$1
do
    mv  $FILE  ${FILE%$1*}$2
done


Shell变量的初始值
${var:=初始值}

任务需求:
1)编写一个脚本,计算从1~x之间所有整数的和
2)x的值由脚本在运行时提示用户输入,若未输入则默认取值为 1

#!/bin/bash
read  -p  "Input an integer: "  x
while  [  "${i:=1}" -le  "${x:=1}"  ]
do
    let sum+=$i
    let i++
done
echo "sum=$sum"

变量:使用一个固定的名称来存放一个变化的值
数组:使用一个固定的名称来存放多个变化的值


星期袜/裤 ——
    周一   ==》 红色
    周二   ==》 橙色
    .. ..
    周日  ==》 紫色

定义数组:星期袜=(红色  橙色  .. ..  紫色)
调用数组元素:echo  ${星期袜[0]}、echo  ${星期袜[1]}

任务需求:
改写 chuquan.sh 脚本,利用数组简化代码
#!/bin/bash
quan=(石头  剪刀  布)
echo  ${quan[$[RANDOM%3]]}


获取一个数组的元素的个数:
echo  ${#数组名[@]}

获取一个变量的字符个数:
echo  ${#变量名}
echo  ${#数组名[0]}

expect预期交互 ——

<< 操作,用来指定一段文档的起始和结束标记

命令行 << EOF
line asdfasd
line asdfs
EOF

任务需求:编写脚本 ssh.sh
1)能够自动向远程的 server0、desktop0这两台主机部署文件
2)部署的文件内容为"TEDU.CN",文件位于 /tmp/mike.txt

#!/bin/bash
for  ip  in  server0  desktop0
do
expect << EOF
spawn ssh  -o StrictHostKeyChecking=no  root@$ip
expect "password" {send "redhat\r" }
expect "#" {send "echo TEDU.CN > /tmp/mike.txt\r" }
expect "#" {send "exit\r" }
EOF
done
echo "文件部署完毕"

任务需求:使用 egrep 完成下列操作
1)列出 /etc/resolv.conf 中包含 net(-i忽略大小写) 的行
2)列出 /etc/resolv.conf 中包含 nameserver 的行
3)列出 /etc/resolv.conf 中不包含 nameserver 的行(-v)
4)列出 /etc/resolv.conf 中以 # 开头或包含 domain 的行(|)
5)列出 /etc/resolv.conf 中包含 172 的行的行号(-n)
6)列出 /etc/resolv.conf 中包含 172 的行的数量(-c)
7)检查 /etc/resolv.conf 中是否已设置 172.25.254.254,如果是则显示yes,不要显示其他无关信息
# egrep  -i net  /etc/resolv.conf
# egrep  nameserver  /etc/resolv.conf
# egrep  -v  nameserver  /etc/resolv.conf
# egrep  '^#|domain'  /etc/resolv.conf
# grep -n 172 /etc/resolv.conf
# grep -c 172 /etc/resolv.conf
# grep -q 172.25.254.254 /etc/resolv.conf && echo yes

正则表达式 ——  通用知识
通过特殊符号来描述一个字符串的特点

a
TEDU

 10k+
  10k?

任务需求:
1)提取网卡eth0的mac地址
# ifconfig eth0 | egrep -o '([0-9a-f]{2}:){5}[0-9a-f]{2}'

aa:bb:cc:dd:ee:ff
==》 ..:..:..:..:..:..
==》
[0-9a-f]{2}:[0-9a-f]{2}:[0-9a-f]{2}:[0-9a-f]{2}:[0-9a-f]{2}:[0-9a-f]{2}
==》
([0-9a-f]{2}:){5}[0-9a-f]{2}

2)提取网卡eth0的IP地址
# ifconfig eth0 | egrep '[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}'

aaa.bbb.ccc.ddd
==》.{1,3}\..{1,3}\..{1,3}\..{1,3}
==》[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}
==》([0-9]{1,3}\.){3}[0-9]{1,3}

匹配1开头、1结尾的IP地址字符串:
1[0-9]{0,2}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{0,2}1


+         --》匹配最少一次
?          --》匹配最多一次
*          --》匹配任意多次
.*         --》匹配任意长度的任意字符
[ ]          --》匹配范围内任意字符
{n,m}     --》匹配前面的字符或字符串指定的次数(从n~m次)

任务需求:
1)找出 /etc/resolv.conf 文件中每一行的前3个字符
# egrep  -o  '^...'  /etc/resolv.conf
# cat  /etc/resolv.conf  |  cut  -b  -3
2)找出 yum  info  httpd 命令行结果中包含 http://。。。/ 的行
# yum  info  httpd | egrep  'http://.*/'


转义(改变字符本来的含义)符号\

\b  代表单词边界
\.     只匹配一个 .


总结:
1)字符串处理(子串截取、替换、砍头、剁脚、初始值)
2)数组
3)expect预期交互
4)正则表达式


任务需求:
1)新建一个文档 reg.txt ,内容如下
[email protected]
http://sina.com.cn
172.25.0.11
版权所有@2018
1.2.3.4.5.6.7.8
[email protected]
2)列出 reg.txt 文件中以数字开头的行
3)列出 reg.txt 文件中合法的电子邮件地址
4)列出 reg.txt 文件中合法的电子邮件地址

猜你喜欢

转载自blog.csdn.net/xixi1067087210/article/details/81501456