博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
SHELL流程控制内容的讲解及脚本练习
阅读量:3961 次
发布时间:2019-05-24

本文共 3627 字,大约阅读时间需要 12 分钟。

SHELL流程控制内容的讲解及脚本练习

1.for

for	    定义变量do	    使用变量,执行动作done	结束标志格式1:#!/bin/bashfor WESTOS in `seq 2 2 10`do        echo $WESTOSdone格式2:for WESTOS in 1 2 3do        echo $WESTOSdone格式3:for WESTOS in {
10..1}do echo $WESTOSdone格式4:for ((WESTOS=0;WESTOS<10;WESTOS++))do echo $WESTOSdone
  • 脚本练习:
    check_host.sh
    用此脚本检测10台与您当前主机直连主机是否网络通常
    如果网络通常请显示主机的ip列表
vim check_host.shfor ip in {
1..10}do ping -w1 -c1 172.25.254.$ip &>/dev/null && {
echo 172.25.254.$ip }done

  • 脚本练习:将userfile里的用户和passfile的密码一一匹配,并将用户建立出来。
下图的sed -n '$=' userfile可以替换为awk 'BEGIN{N=0}{N++}END{print N}' userfile

2.while

while ture	#条件为真do		#条件成立所作循环动作done

3.until

until false	##条件为假do      #条件不成立所作循环动作done

4.if

ifthenelifthen...elsefi
  • 脚本练习:
    check_file.sh
    please input filename: file
    file is not exist
    file is file
    file is direcory
    此脚本会一直询问直到用户输入exit为止
while truedo      read -p " please input filename : " filename      if [ "$filename" = "exit" -o "$filename" = "EXIT" ]      then  	      echo bye	      exit      elif [ -z "$filename" ]      then	      echo -n ""     ##进入下一行      elif [ ! -e "$filename" ]      then     	  echo  $filename is not exist      elif [ -f "$filename" ]       then          echo $filename is file      elif [ -d "$filename" ]      then	      echo $filenmae is direcory      else	      echo ukown file type      fi     done

5.case

case $1 in	word1|WORD1)	action1	;;	word2|WORD2)	action2	;;	*)	action3esac
  • 脚本练习
    system_watch.sh disk memory upload (每秒显示)
    disk 监控磁盘使用情况
    memory 监控内存使用情况
    upload 监控启动负载
case $1 in	disk)	watch  -t -n  1 df   -H   #-t会关闭watch命令在顶部的时间间隔	;;    memory)	watch  -t -n  1 free -m	;;    upload)	watch  -t -n  1 uptime	;;    *)	echo -e "Error:Please input correct options!!"esac

在输入前可以进行一下提示,提示应该输入哪些内容。

6.expect

dnf install expect -y问题脚本#!/bin/bashread -p "what's your name:" NAMEread -p "How old are you: " AGE read -p "Which objective: " OBJread -p "Are you ok? " OKecho $NAME is $AGE\'s old study $OBJ feel $OK应答脚本    #expect answer.exp#!/usr/bin/expectset timeout 1set NAME [ lindex $argv 0 ]set AGE  [ lindex $argv 1 ]set OBJ	 [ lindex $argv 2 ]set FEEL [ lindex $argv 3 ]spawn /mnt/ask.shexpect {
"name" {
send "$NAME\r";exp_continue } "old" {
send "$AGE\r";exp_continue } "objective" {
send "$OBJ\r";exp_continue } "ok" {
send "$FEEL\r" }}expect eof

问题脚本

应答脚本
进行应答的简化:
当问题脚本和应答脚本同时写进一个sh脚本,写法如下:

  • 脚本练习:
    $?:是上一指令的返回值,成功是0,不成功是1。一般来说,UNIX(linux) 系统的进程以执行系统调用exit() 来结束的。这个回传值就是status值。回传给父进程,用来检查子进程的执行状态。一般指令程序倘若执行成功,其回传值为 0;失败为 1。
  • 脚本练习:
查看能连接的主机里面有没有westos用户,如果没有,则建立westos用户,密码westos[root@localhost mnt]# cat host_list.sh #!/bin/bashEXPECT(){
/usr/bin/expect << EOFset timeout 3spawn ssh root@172.25.254.$1 "$2"expect {"yes/no" { send "yes\r";exp_continue }"password:" { send "westos\r" }}expect eofEOF}for IP in {
1..10}do ping -c1 -w1 172.25.254.$IP &>/dev/null &&{
USER_STATE=`EXPECT $IP "getent passwd $1" | grep -E '/authenticity|ECDSA|connecting|Warning|sqawn|password' -v ` if [ -n "$USER_STATE" ] then echo "$1 on 172.25.254.$IP is exist " else EXPECT $IP "useradd $1 && echo $2 | passwd --stdin $1" fi }donesh host_list.sh westos westos
查看当前主机能连接的主机的主机名[root@localhost mnt]# cat host_list.sh #!/bin/bashEXPECT(){
/usr/bin/expect << EOFset timeout 3spawn $1expect {"yes/no" { send "yes\r";exp_continue }"password:" { send "westos\r" }}expect eofEOF}for IP in {
1..10}do ping -c1 -w1 172.25.254.$IP &>/dev/null &&{
EXPECT "ssh root@172.25.254.$IP hostname" | tail -n 1 }done

7.break,continue,exit

contiue		##终止当此次前循环提前进入下个循环break		##终止当前所在语句所有动作进行语句外的其他动作exit		##脚本退出

转载地址:http://inhzi.baihongyu.com/

你可能感兴趣的文章
【IPFS指南】IPFS的竞争对手们(一)
查看>>
docker更换国内镜像
查看>>
CentOS 下 tree命令用法详解
查看>>
docker上传镜像至Registry时https报错解决方法
查看>>
安装 docker-compose (实测可用,妈妈再也不用担心被墙了)
查看>>
docker下删除none的images
查看>>
Linux提权获取敏感信息方法
查看>>
Ubuntu 16.04开机A start job is running for Raise network interface(5min 4s)解决方法
查看>>
Ubuntu 16.04开机隐藏菜单缩短时间
查看>>
Ubuntu 更换国内源
查看>>
Ubuntu16.04下Docker pull connection refused 解决办法
查看>>
postgres基本操作(个人总结版)
查看>>
The AnimationClip 'Walk' used by the Animation component 'Pig' must be marked as Legacy.
查看>>
《Linux内核设计与实现》- Linux的进程
查看>>
inet_ntoa()
查看>>
POSIX消息队列mq_open问题
查看>>
两个数组a[N],b[N],其中A[N]的各个元素值已知,现给b[i]赋值,b[i] = a[0]*a[1]*a[2]…*a[N-1]/a[i];
查看>>
用户态切换到内核态的3种方式
查看>>
笔试常见的智力题(附答案)
查看>>
内核库函数
查看>>