shell 编码语句

编码语句分类:

  顺序执行
  选择执行
  循环执行

选择执行:if

if 语句格式:
      if 判断条件       then       条件为真时分支代码        fi
      
if 判断条件;then       条件为真时分支代码       else       条件为假时分支代码       fi

      if 判断条件;then
        条件为真时分支代码
      elif 判断条件;then
        条件为真时分支代码
      ...

      else
        条件为假时分支代码
      fi


for 循环(循环次数已知)

for格式:
        for 变量名 in 列表; do
            循环体
        done

        循环体:依赖于调用变量来实现其变化;

        循环可以嵌套;

        退出条件:遍历列表完成

for的第二种使用格式 :
        for ((初始条件;测试条件;修改表达式)); do
            循环体
        done

while循环(循环次数未知)

while格式:


        while 测试条件; do
            循环体
        done

        测试条件为真,进入循环;测试条件为假,退出循环;
        测试条件一般通过变量来描述,需要在循环体不变量地改变变量的值,以确保某一时刻测试条件为假,进而结束循环;

while循环:遍历文本文件

   格式:

        while read 变量名; do
            循环体
        done < /path/to/somefile

        变量名,每循环一次,记忆了文件中一行文本

until循环(循环次数未知)

until格式:


        until 测试条件; do
            循环体
        done

        测试条件为假,进入循环;测试条件为真,退出循环;
        测试条件一般通过变量来描述,需要在循环体不变量地改变变量的值,以确保某一时刻测试条件为真,进而结束循环;

case语句:有多个测试条件时,case语句会使得语法结构更明晰

case语句格式:
      case 变量引用 in   PATTERN1)   分支1   ;; PATTERN2) 分支2 ;; ... *) 分支n ;; esac PATTERN:类同于文件名通配机制,但支持使用|表示或者; a|b: a或者b *:匹配任意长度的任意字符 ?: 匹配任意单个字符 []: 指定范围内的任意单个字符

 实例

创建 Linux 系统账户及密码

    #!/bin/bash
    useradd    "$1" 
    echo "$2"  |  passwd  ‐‐stdin  "$2"

    
备份日志

    #!/bin/bash
    # 每周 5 使用 tar 命令备份/var/log 下的所有日志文件
    tar    -czf    log-`date +%Y%m%d`.tar.gz    /var/log 

    
监控内存和磁盘容量当小于给定值时报警

    #!/bin/bash
    # 实时监控本机内存和硬盘剩余空间,剩余内存小于500M、根分区剩余空间小于1000M时,发送报警邮件给root管理员
     
    # 提取根分区剩余空间
    disk_size=$(df / | awk '/\//{print $4}')
    # 提取内存剩余空间
    mem_size=$(free | awk '/Mem/{print $4}')
    while :
    do
    # 注意内存和磁盘提取的空间大小都是以 Kb 为单位
    if  [  $disk_size -le 512000 -a $mem_size -le 1024000  ]
    then
        mail  ‐s  "Warning"  root  <<EOF
        Insufficient resources,资源不足
    EOF
    fi
    done


猜数字游戏
    #!/bin/bash
    # RANDOM 为系统自带的系统变量,值为 0‐32767的随机数,生成一个 100 以内的随机数
    num=$[RANDOM % 100 + 1]
    echo "$num"

    while :
    do 
        # 使用 read 提示用户猜数字
        read -p "请输入你猜的数据:" guess
        if [ $num -eq $guess ]
            then
                echo "恭喜你猜对了"
                exit
        elif [ $num -lt $guess ]
            then
                echo "你猜大了"
        else
                echo "你猜小了"
        fi
    done 


检测本机当前用户是否为超级管理员,如果是管理员,则使用 yum 安装 vsftpd,如果不是,则提示您非管理员

    #!/bin/bash
    #使用字串对比
    if [ $USER     == "root" ]
        then
            yum -y install tree 
    else
        echo "当前用户无权限"
    fi


    检测用户UID,(root用户UID为0)
    if [ $user -eq 0 ];then
        yum -y install tree
    else
        echo "当前用户无权限"
    fi


#编写脚本:提示用户输入用户名和密码,脚本自动创建相应的账户及配置密码。如果用户不输入账户名,则提示必须输入账户名并退出脚本;如果用户不输入密码,则统一使用默认的123456 作为默认密码。

    #!/bin/bash
    read -p "请输入用户名: " user
    #使用‐z 可以判断一个变量是否为空,如果为空,提示用户必须输入账户名,并退出脚本,退出码为 2
    #没有输入用户名脚本退出后,使用$?查看的返回码为 2
    if [ -z $user ];then
        echo "该账户已存在"
        exit 2
    fi
    #使用 stty ‐echo 关闭 shell 的回显功能
    stty -echo
    read -p "请输入密码: " pass
    #使用 stty  echo 打开 shell 的回显功能
    stty echo
    pass=${pass:‐123456}
    useradd "$user"
    echo "$pass" | passwd ‐‐stdin "$user"


输入三个数并进行升序排序

    #!/bin/bash
    # 依次提示用户输入 3 个整数,脚本根据数字大小依次排序输出 3 个数字
    read -p "请输入一个整数:" num1
    read -p "请输入一个整数:" num2
    read -p "请输入一个整数:" num3
    # 不管谁大谁小,最后都打印 echo "$num1,$num2,$num3"
    # num1 中永远存最小的值,num2 中永远存中间值,num3 永远存最大值
    tmp=0
    # 如果 num1 大于 num2,就把 num1 和和 num2 的值对调,确保 num1 变量中存的是最小值
    if [ $num1 -gt $num2 ];then   
        tmp=$num1
        num1=$num2
        num2=$tmp
    fi
    # 如果 num1 大于 num3,就把 num1 和 num3 对调,确保 num1 变量中存的是最小值
    if [ $num1 -gt $num3 ];then   
          tmp=$num1
          num1=$num3
          num3=$tmp
    fi
    # 如果 num2 大于 num3,就把 num2 和 num3 对标,确保 num2 变量中存的是小一点的值
    if [ $num2 -gt $num3 ];then
          tmp=$num2
          num2=$num3
          num3=$tmp
    fi
    echo "排序后数据为:$num1,$num2,$num3"
    

    
石头、剪刀、布游戏

    #!/bin/bash
    # 编写脚本,实现人机<石头,剪刀,布>游戏
    game=(石头 剪刀 布)
    num=$[RANDOM%3]
   
     
    echo "请根据下列提示选择您的出拳手势"
    echo "1.石头"
    echo "2.剪刀"
    echo "3.布"
     
    read -p "请选择 1‐3:" person
    case  $person  in
    1)
      if [ $num -eq 0 ]
      then
        echo "平局"
        elif [ $num -eq 1 ]
        then
          echo "你赢"
      else
        echo "计算机赢"
      fi;;
    2)   
      if [ $num -eq 0 ]
      then
        echo "计算机赢"
        elif [ $num -eq 1 ]
        then
          echo "平局"
      else
        echo "你赢"
      fi;;
    3)
      if [ $num -eq 0 ]
      then
        echo "你赢"
        elif [ $num -eq 1 ]
        then
          echo "计算机赢"
      else
        echo "平局"
      fi;;
    *)
      echo "必须输入 1‐3 的数字"
    esac


编写脚本测试 192.168.4.0/24 整个网段中哪些主机处于开机状态,哪些主机处于关机状态(for 版本)

    #!/bin/bash
    # 编写脚本测试 192.168.4.0/24 整个网段中哪些主机处于开机状态,哪些主机处于关机
    # 状态(for 版本)
    for i in {1..254}
    do
        # 每隔0.3秒ping一次,一共ping2次,并以1毫秒为单位设置ping的超时时间
           ping ‐c 2 ‐i 0.3 ‐W 1 192.168.4.$i  &>/dev/null
        if  [ $? -eq 0 ];then
               echo "192.168.4.$i is up"
           else
               echo  "192.168.4.$i is down"
           fi
    done

    
# (while 版本)
    
    #!/bin/bash 
    i=1
    while [ $i -le 254 ]
    do
        ping ‐c 2 ‐i 0.3 ‐W 1 192.168.4.$i  &>/dev/null
        if  [ $? -eq 0 ];then
            echo "192.168.4.$i is up"
        else
            echo  "192.168.4.$i is down"
        fi
        let i++
    done


# 状态(多进程版)
    #!/bin/bash
    #定义一个函数,ping 某一台主机,并检测主机的存活状态
    myping(){
    ping ‐c 2 ‐i 0.3 ‐W 1 $1  &>/dev/null
    if  [ $? -eq 0 ];then
        echo "$1 is up"
    else
        echo "$1 is down"
    fi
    }
    for i in {1..254}
    do
        myping 192.168.4.$i &
    done

 

备份日志

    #!/bin/bash
    # 每周 5 使用 tar 命令备份/var/log 下的所有日志文件
    tar    -czf    log-`date +%Y%m%d`.tar.gz    /var/log 

    
监控内存和磁盘容量当小于给定值时报警

    #!/bin/bash
    # 实时监控本机内存和硬盘剩余空间,剩余内存小于500M、根分区剩余空间小于1000M时,发送报警邮件给root管理员
     
    # 提取根分区剩余空间
    disk_size=$(df / | awk '/\//{print $4}')
    # 提取内存剩余空间
    mem_size=$(free | awk '/Mem/{print $4}')
    while :
    do
    # 注意内存和磁盘提取的空间大小都是以 Kb 为单位
    if  [  $disk_size -le 512000 -a $mem_size -le 1024000  ]
    then
        mail  ‐s  "Warning"  root  <<EOF
        Insufficient resources,资源不足
    EOF
    fi
    done



#!/bin/bash
# RANDOM 为系统自带的系统变量,值为 0‐32767的随机数,生成一个 100 以内的随机数
num=$[RANDOM % 100 + 1]
echo "$num"

while :
do 
    # 使用 read 提示用户猜数字
    read -p "请输入你猜的数据:" guess
    if [ $num -eq $guess ]
        then
            echo "恭喜你猜对了"
            exit
    elif [ $num -lt $guess ]
        then
            echo "你猜大了"
    else
            echo "你猜小了"
    fi
done 


检测本机当前用户是否为超级管理员,如果是管理员,则使用 yum 安装 vsftpd,如果不是,则提示您非管理员

#!/bin/bash

#使用字串对比
if [ $USER     == "root" ]
    then
        yum -y install tree 
else
    echo "当前用户无权限"
fi


检测用户UID,(root用户UID为0)
if [ $user -eq 0 ];then
    yum -y install tree
else
    echo "当前用户无权限"
fi


# 编写脚本:提示用户输入用户名和密码,脚本自动创建相应的账户及配置密码。如果用户不输入账户名,则提示必须输入账户名并退出脚本;如果用户不输入密码,则统一使用默认的123456 作为默认密码。
#!/bin/bash

read -p "请输入用户名: " user
#使用‐z 可以判断一个变量是否为空,如果为空,提示用户必须输入账户名,并退出脚本,退出码为 2
#没有输入用户名脚本退出后,使用$?查看的返回码为 2
if [ -z $user ];then
       echo "该账户已存在"
     exit 2
fi
#使用 stty ‐echo 关闭 shell 的回显功能
stty -echo
read -p "请输入密码: " pass
#使用 stty  echo 打开 shell 的回显功能
stty echo
pass=${pass:‐123456}
useradd "$user"
echo "$pass" | passwd ‐‐stdin "$user"


输入三个数并进行升序排序

    #!/bin/bash
    # 依次提示用户输入 3 个整数,脚本根据数字大小依次排序输出 3 个数字
    read -p "请输入一个整数:" num1
    read -p "请输入一个整数:" num2
    read -p "请输入一个整数:" num3
    # 不管谁大谁小,最后都打印 echo "$num1,$num2,$num3"
    # num1 中永远存最小的值,num2 中永远存中间值,num3 永远存最大值
    tmp=0
    # 如果 num1 大于 num2,就把 num1 和和 num2 的值对调,确保 num1 变量中存的是最小值
    if [ $num1 -gt $num2 ];then   
        tmp=$num1
        num1=$num2
        num2=$tmp
    fi
    # 如果 num1 大于 num3,就把 num1 和 num3 对调,确保 num1 变量中存的是最小值
    if [ $num1 -gt $num3 ];then   
          tmp=$num1
          num1=$num3
          num3=$tmp
    fi
    # 如果 num2 大于 num3,就把 num2 和 num3 对标,确保 num2 变量中存的是小一点的值
    if [ $num2 -gt $num3 ];then
          tmp=$num2
          num2=$num3
          num3=$tmp
    fi
    echo "排序后数据为:$num1,$num2,$num3"
    

    
石头、剪刀、布游戏

    #!/bin/bash
    # 编写脚本,实现人机<石头,剪刀,布>游戏
    game=(石头 剪刀 布)
    num=$[RANDOM%3]
   
     
    echo "请根据下列提示选择您的出拳手势"
    echo "1.石头"
    echo "2.剪刀"
    echo "3.布"
     
    read -p "请选择 1‐3:" person
    case  $person  in
    1)
      if [ $num -eq 0 ]
      then
        echo "平局"
        elif [ $num -eq 1 ]
        then
          echo "你赢"
      else
        echo "计算机赢"
      fi;;
    2)   
      if [ $num -eq 0 ]
      then
        echo "计算机赢"
        elif [ $num -eq 1 ]
        then
          echo "平局"
      else
        echo "你赢"
      fi;;
    3)
      if [ $num -eq 0 ]
      then
        echo "你赢"
        elif [ $num -eq 1 ]
        then
          echo "计算机赢"
      else
        echo "平局"
      fi;;
    *)
      echo "必须输入 1‐3 的数字"
    esac


编写脚本测试 192.168.4.0/24 整个网段中哪些主机处于开机状态,哪些主机处于关机状态(for 版本)

    #!/bin/bash
    # 编写脚本测试 192.168.4.0/24 整个网段中哪些主机处于开机状态,哪些主机处于关机
    # 状态(for 版本)
    for i in {1..254}
    do
        # 每隔0.3秒ping一次,一共ping2次,并以1毫秒为单位设置ping的超时时间
           ping ‐c 2 ‐i 0.3 ‐W 1 192.168.4.$i  &>/dev/null
        if  [ $? -eq 0 ];then
               echo "192.168.4.$i is up"
           else
               echo  "192.168.4.$i is down"
           fi
    done

    
    
    #!/bin/bash

# (while 版本) 
i=1
while [ $i -le 254 ]
do
       ping ‐c 2 ‐i 0.3 ‐W 1 192.168.4.$i  &>/dev/null
       if  [ $? -eq 0 ];then
           echo "192.168.4.$i is up"
    else
           echo  "192.168.4.$i is down"
       fi
       let i++
done


#!/bin/bash
# 状态(多进程版)
 
#定义一个函数,ping 某一台主机,并检测主机的存活状态
myping(){
ping ‐c 2 ‐i 0.3 ‐W 1 $1  &>/dev/null
if  [ $? -eq 0 ];then
    echo "$1 is up"
else
    echo "$1 is down"
fi
}
for i in {1..254}
do
       myping 192.16
posted @ 2019-02-11 10:05  Coolc  阅读(1035)  评论(0编辑  收藏  举报