• 简单shell脚本的编写


    shell脚本就是将命令写入文本中,文本可以被执行。

    脚本:本质是一个文件,文件里面存放的是 特定格式的指令,系统可以使用脚本解析器 翻译或解析 指令 并执行(它不需要编译)

    shell 既是应用程序,又是一种脚本语言(应用程序 解析 脚本语言)。

    简单使用

    $0 表示当前脚本的名称
    $* 表示脚本的所有参数
    $# 表示脚本的参数的个数
    $? 程序执行完后的结果,返回值0表示执行成功

    $n 表示脚本的第n个参数,n=1,2,3,4,5…9

    #!bin/bash
    echo "当前脚本的名称为$O"
    
    • 1
    • 2

    双引号会解释变量

    单引号会把变量当成字符串表示

    没有给这个脚本赋予可执行权限就用bash来执行该脚本

    image-20230826130448301

    #!bin/bash
    echo "当前脚本的名称为$O"
    echo "总共有$#个参数,分别是$*"
    
    • 1
    • 2
    • 3

    image-20230826131058992

    #!bin/bash
    echo "当前脚本的名称为$O"
    echo "总共有$#个参数,分别是$*"
    echo "第一个参数是$1,第三个参数是$3"
    
    • 1
    • 2
    • 3
    • 4

    image-20230826131207513

    shell脚本参数判断

    • 1、文件测试语句
      • -d 测试文件是否是目录类型
        • 是目录返回0,不是目录返回非0
      • -e 测试文件是否存在
      • -f 判断是否为一般文件
      • -r 判断当前用户对该文件是否有==读取==权限
      • -w 判断当前用户对该文件是否有==写入==权限
      • -x 判断当前用户对该文件是否有==执行==权限
    • 2、逻辑测试语句
    • 3、整数值测试语句
    • 4、字符串比较语句

    判断/etc/passwd是否为目录

    ┌──(kali💋kali)-[~/Desktop]
    └─$ [ -d  /etc/passwd ]
                                                                                
    ┌──(kali💋kali)-[~/Desktop]
    └─$ echo $?                                                             11
    #  $?表示上一步的结果,用echo 输出  
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    返回值为1,表示/etc/passwd不是目录

    ┌──(kali💋kali)-[~/Desktop]
    └─$ ls
    demo.sh  zs
                                                                                
    ┌──(kali💋kali)-[~/Desktop]
    └─$ [ -d  zs ]    
                                                                                
    ┌──(kali💋kali)-[~/Desktop]
    └─$ echo $?
    0                                                                        
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    image-20230826132641472

    ┌──(kali💋kali)-[~/Desktop]
    └─$ [ -d  demo.sh ]
                                                                                
    ┌──(kali💋kali)-[~/Desktop]
    └─$ echo $?                                                             11
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    image-20230826132602446

    一条命令完成上述命令 &&

    && 必须保证两边都为真,条件才会成立,有一边为假条件都不会成立

    ┌──(kali💋kali)-[~/Desktop]
    └─$ [ -f  /etc/passwd ] && echo "该/etc/passwd是文件"                  
    该/etc/passwd是文件      
    
    
    # [ -f  /etc/passwd ]  为真,确实是文件,
    # 则执行后面的echo语句
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    image-20230826133443273

    ┌──(kali💋kali)-[~/Desktop]
    └─$ [  $USER=kali ] && echo "该用户是kali用户"
    该用户是kali用户
                       
    
    • 1
    • 2
    • 3
    • 4

    image-20230826140216263

    || 两边有一个为真就为真,两边都为真也为真

    ┌──(kali💋kali)-[~/Desktop]
    └─$ [ $USER=kali ] ||   echo "该用户是kali用户"                                     
    
    • 1
    • 2

    ! 表示取反

    ┌──(kali💋kali)-[~/Desktop]
    └─$ [ ! $USER=kali ] ||   echo "该用户是kali用户"
    该用户是kali用户
    
    • 1
    • 2
    • 3

    要求普通用户输出user,管理员用户输出superuser

    [ ! $USER = kali ] &&  echo "superuser" || echo "user"
    
    • 1

    image-20230826140635012

    整数的比较运算符

    -eq 等于
    -ne 不等于
    -gt 大于
    -lt 小于
    -le 等于或小于
    -ge 等于或大于
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    ┌──(kali💋kali)-[~/Desktop]
    └─$ [ 9 -gt 9 ]                                           
                                                                   
    ┌──(kali💋kali)-[~/Desktop]
    └─$ echo $?                                                
    1
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    image-20230826142855907

    字符串的比较运算

    = 比较字符串内容是否相同
    != 比较字符串内容是否为空
    -z 判断字符串内容是否为空
    
    • 1
    • 2
    • 3

    image-20230826143230975

    image-20230826143328453

    ┌──(kali💋kali)-[~/Desktop]
    └─$ [ $LANG = "en_US.UTF-8" ] && echo "支持英文" || echo "支持中文"
    支持英文 
    
    • 1
    • 2
    • 3

    image-20230826143722490

    shell脚本流程控制

    if 条件
    then 命令
    else 命令
    fi
    
    • 1
    • 2
    • 3
    • 4

    if…

    #!/bin/bash
    DIR="/home/kali/Desktop/demo"
    if [ ! -e $DIR]
    then 	
    	mkdir -p $DIR
    fi
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    if…else…

    #!/bin/bash
    ping -c 3 -i 0.2 -w 3 $1 &>/dev/null
    
    if [ $? -eq 0 ]
    then 
    	echo "该$1是正常的"
    else
    	echo "该$1是不正常的"
    fi
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    image-20230826150236438

    if…else…多级嵌套

    #!/bin/ash
    if [ -z $1  ]
    then 
    	echo "作者:zs"
    	echo "该命令是检测服务器IP是否正常"
    	echo "直接在命令后面加参数IP就可以执行"
    else
    	ping -c 3 -i 0.2 -w 3 $1 &>/dev/null
    
    	if [ $? -eq 0 ]
    	then 
    		echo "该$1是正常的"
    	else
    		echo "该$1是不正常的"
    	fi
    
    fi
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17

    if…elif…else

    read -p "请输入分数 [1--100]:" score
    if [ $score -ge 85 ] && [ $score -le 100 ] ;then
    	echo "优秀"
    elif [ $score -ge 70 ] && [ $score -le 84 ] ;then
    	echo "合格"
    else
    	echo "不合格"
    fi
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    image-20230826153620595

    shell脚本循环

    for循环
    for 变量名 in 取值列表
    do
     命令序列
    done
    
    • 1
    • 2
    • 3
    • 4
    批量添加用户

    在这里插入图片描述

    #!/bin/bash
    #循环语句
    read -p "请输入密码:" PASSWORD
    
    for USERNAME  in  `cat user.txt`
    do
    	id $USERNAME &>/dev/null
    	if [ $? -eq 0 ]
    	then 
    		echo "该用户$USERNAME 已经存在"
    	else
    		useradd $USERNAME &>/dev/null
    		echo "$PASSWORD"| passwd --stdin $USERNAME &>/dev/null
    		echo "该用户$USERNAME添加成功"
    	fi
    done
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    批量ping IP地址

    image-20230826160950004

    #!/bin/bash
    #批量pingIP地址
    HOSTLIST=$(cat /home/kali/Desktop/iplist.txt)
    for IP in $HOSTLIST
    do 
    	ping -c 3 -i 0.2 -w 3 $IP &>/dev/null
    	if [ $? -eq 0 ]
    	then
    		echo "该IP:$IP是正常的"
    	else
    		echo "该IP: $IP是ping不通的"
    	fi
    done
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    image-20230826161631043

    检测同一局域网,多台主机存活情况
    #!/bin/bash
    read -p "请输入网络位:" NETWORK
    
    for ip in $(seq 100 254)  #seq用于生成数字100~254
    do
    	ping -c 3 -i 0.2 -w 3 $NETWORK.$ip &>/dev/null  && result=0 || result=1
    	if [ $result -eq 0 ];then
    		echo "IP地址: $NETWORK.$ip is up !!"
    		echo $NETWORK.$ip >> /tmp/up.txt
    	else
    		echo "IP地址: $NETWORK.$ip is down !!"
    		echo $NETWORK.$ip >> /tmp/down.txt
    	fi
    done
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14

    在这里插入图片描述

    多线程检测主机存活情况

    echo输入带颜色的内容相关博客

    #!/bin/bash
    read -p "请输入IP网络位:" ip  
    for i in $(seq 1 254) #seq用于生成数字1~254
        do
        { 
               ping $ip.$i -c1 -s1 2>&1 1>/dev/null &&  
               echo -e ping $ip.$i"\033[32m通的!\033[0m" || 
            echo -e ping $ip.$i"\033[31m不通的!\033[0m" 
            } &  #注意在shell中不支持多线程的.这里&是采用多进程执行方式,{}里执行了,不管结束没结束继续执行下一条.
     
    done
    wait #{}执行完,执行下一条,相当于高级语言多线程同步作用.
    echo "扫描检测已结束。"
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    请添加图片描述

    while循环
    while 条件
    do
    	命令序列
    done
    
    • 1
    • 2
    • 3
    • 4

    $RANDOM是linux中的内置变量,可以随机生成0-32767之间的整数数字

    在这里插入图片描述

    #!/bin/bash
    TIMES=0
    echo "该商品的价格为0--999之间,来猜一猜!"
    PRICE=$(expr $RANDOM % 1000 )
    while true
    do
    	read -p "请输入价格:" INT
    	let TIMES++                       #自增
    	if [ $INT -eq $PRICE ];then
    		echo "恭喜你猜对了,价格为$PRICE"
    		echo "猜了$TIMES次"
    		exit
    	elif [ $INT -gt $PRICE ];then
    		echo "猜高了"
    	else
    		echo "太低了"
    	fi
    done
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18

    image-20230826163244384

    case选择语句
    case 变量值 in 
    模式1
    	命令序列1
    模式2 
    	命令序列2
    ....
    	默认命令序列
    esac
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    #!/bin/bash
    read -p "请输入一个字符:" KEY
    case "$KEY" in
    	[a-z]|[A-Z])
    		echo "这是字母"
    		;;
    	[0-9])
    		echo "这是数字"
    		;;
    	*)
    		echo "这是特殊符号"
    esac
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    image-20230826164122016

  • 相关阅读:
    【Android笔记51】Android之两种常见的数据交互方式(Activity和Activity、Activity和数据适配器)
    部门来了个测试开发,听说是00后,上来一顿操作给我看呆了...
    再出发感怀
    基于象鼻虫损害优化算法求解单目标无约束问题并可视化分析(Matlab代码实现)
    SpringCloud微服务(七)——Bus服务消息总线
    ASEMI整流桥堆GBJ406的作用,GBJ406整流桥型号及参数
    李宏毅机器学习笔记(2016年的课程):Support Vector Machine (SVM)
    Diffusion-GAN: Training GANs with Diffusion 解读
    常用设计模式——策略模式
    厉害了,腾讯内部都用的Spring+MyBatis源码手册,实战理论两不误
  • 原文地址:https://blog.csdn.net/ZhaoSong_/article/details/132513361