• Shell 脚本学习


    Shell 脚本学习

    本文不详细讲解,理论和用法。希望通过几个Shell脚本案例快速上手Shell脚本的编写

    参考

    基本使用方法

    变量的声明

    变量名=变量值
    
    • 1

    删除变量

    unset 变量名
    
    • 1

    将命令的输出赋值给变量

    变量名=`command`
    
    • 1

    与输入输出有关的文件描述

    文件描述符文件名类型硬件
    0stdin标准输入文件键盘
    1stdout标准输出文件显示器
    2stderr标准错误输出文件显示器

    $…的作用

    符号说明
    $$Shell 本身的PID
    $!Shell 最后运行的后台Process的PID
    $?最后运行的命令的结束代码(返回值),即执行上一条指令的返回值(显示最后命令的退出状态。0表示没有错,其他任何值表明有错误)
    $-使用Set命令设定Flag一览
    $*所有参数列表
    $@所有参数列表
    $#添加到Shell 的参数个数
    $0Shell本身的文件名
    $1- $n添加到Shell的各参数值,序号表示第几个参数

    -…的作用

    文件表达

    符号说明
    -e filename如果filename存在,则为真
    -d filename如果filename为目录,则为真
    -ffilename 为常规未见,则为真
    -Lfilename 为符号链接,则为真
    -rfilename 可读,则为真
    -wfilename 可写,则为真
    -xfilename 可执行,则为真
    -sfilename 文件长度不为0,则为真
    -h如果文件是软链接,则为真

    整数变量表达式

    符号说明
    -eq等于
    -ne不等于
    -gt大于
    -ge大于等于
    -lt小于
    -le小于等于

    案例

    文件读入数据实现赋值

    #! /bin/bash
    ls *.c > execfile
    while read LINE
    do
            chmod +x ${LINE}
    done<execfile
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    这个程序表明从execfile中读入数据,并将循环得到的每行数据赋值给变量LINE。然后将其中的每个以.c结尾的文件赋予可执行权限。

    多进程测试网段中哪些主机处于开机状态

    while 版本

    #!/bin/bash
    
    clear_file(){
      cat /dev/null > iplog.txt
    }
    
    i=1
    MaxRange=20
    
    clear_file
    while [ $i -le ${MaxRange} ]
    do  
      ping -c 2 -i 0.3 -W 1 192.168.4.${i} &>/dev/null
      if [ $? -eq 0 ];then
      echo "192.168.4.${i}" >> iplog.txt
      else
      echo "192.168.4.${i} is down"
      fi
      let i++
    done
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20

    这里比较费解的就是 $?,代表的其实就是上一条指令的返回值(显示最后命令的退出状态,0表示没有错误,其他任何值表明有错误)。

    这样其实就好理解上面这段脚本的运作原理了。

    多进程版本

    #!/bin/bash
    
    clear_file(){
      cat /dev/null > iplog.txt
    }
    
    i=1
    
    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..20}
    do
      myping 192.168.4.${i} &
    done
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21

    使用&符号,将执行的函数放入后台执行

    这样做的好处就是不需要等待ping第一台主机的回应,就可以继续并发ping第二台主机,依次类推。

    可以观察运行的输出多进程版本明显快于单进程版本

    查看有多少远程的IP在连接本机

    #!/bin/bash
    
    #查看有多少远程的 IP 正在连接本机(不管是通过 ssh 还是 web 还是 ftp都统计)
    #使用 ``netstat -atn`` 可以查看本机所有连接的状态,-a 查看所有
    #-t 仅显示 tcp 连接的信息, -n 数字格式显示
    #Local Address (第四列是本机的IP和端口信息)
    #Foreign Address (第五列是远程主机的IP和端口信息)
    #使用awk 命令仅显示第5列数据, 再显示第 1 列 IP 地址的信息
    #sort 可以按数字大小排序,最后使用 uniq 将多余重复的删除,并统计重复的次数
    netstat -atn | awk '{print $5}' | awk '{print $1}' | sort -nr | uniq -c
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    打印国际象棋棋盘

    #!/bin/bash
    
    printChess(){
      #打印国际象棋棋盘
      #设置两个变量 i、j 分别代表行和列
      #棋盘的规则其实就是相邻的不同颜色
      #使用echo -ne 打印色块,并且打印完成色块后不自动换行,在同一行继续输出其他色块 
      
      for i in {1..8}
      do
        for j in {1..8}
        do
          sum=$[i+j]
          if [ $[sum%2] -eq 0 ];then
            echo -ne "\033[46m \033[0m"
          else
            echo -ne "\033[47m \033[0m"
          fi
        done
        echo
      done
    }
    printChess
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23

    image-20221103124235538

    模拟程序启动时选择模式

    #!/bin/bash
    
    # programRunning
    checkNumber(){
      case $1 in
      start)
        echo "starting"
        ;;
      stop)
        echo "stoping"
        ;;
      test)
        echo "is testing"
        ;;
      *)
        echo "Usage: {start|stop}"
        ;;
      esac
    }
    
    a=
    read -p "please select option: " a
    checkNumber $a
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23

    获得任务运行的PID

    #!/bin/bash
    
    PID=
    get_pid(){
        PID=`ps -ef | grep root | grep ywh | awk '{print $2}'`
    }
    get_pid
    echo $PID
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
  • 相关阅读:
    华南X99平台打鸡血教程
    MyBatis-Plus
    mybatis-plus的分页变化
    【算法笔记(六)】检索算法
    JavaEE-http/https/Tomcat(上)
    Spring集成MyBatis(自定义类和xml配置文件两种形式)
    【踩坑】工作中真实踩坑,一个or让sql变慢7倍
    GPT-4o如何重塑AI未来!
    MySQL是否有必要使用REPEATABLE READ事务隔离级别?
    linux命令全部失效+无法登录 极限操作
  • 原文地址:https://blog.csdn.net/qq_52785898/article/details/127673856