Bootstrap

shell脚本(6)

声明:学习视频来自b站up主 泷羽sec,如涉及侵权马上删除文章

感谢泷羽sec 团队的教学
视频地址:shell(6)if条件判断与for循环结构_哔哩哔哩_bilibili

本文主要讲解shell脚本中的if条件判断和for循环结构。

一、if语句

Shell 脚本中的 if 语句用于根据条件执行不同的操作。基本语法如下:

if [ 条件 ]; then
    # 条件成立时执行的代码
elif [ 条件 ]; then
    # 条件不成立但满足 elif 的代码
else
    # 所有条件都不满足时执行的代码
fi
 整数比较:
#! /usr/bin/bash
  
a=15
b=20

if [ "$a" -eq "$b" ]; then
        echo "a = b"
elif [ "$a" -gt "$b" ]; then
        echo "a > b"
elif [ "$a" -lt "$b" ]; then
    echo "a < b"
else
        echo "没有符合上述的条件!"
fi
代码解析:
1. 变量定义
a=15 
b=20

  • a: 赋值为15。
  • b: 赋值为20。
2. 判断两个字符串是否相等
if [ "$a" -eq "$b" ]; then
    echo "a = b"
elif [ "$a" -gt "$b" ]; then
    echo "a > b"
elif [ "$a" -lt "$b" ]; then
    echo "a < b"
else
    echo "没有符合上述的条件!"

逻辑分析

  • [ "$a" -eq "$b" ]: 判断 a 和 b 的值是否相等。
  • [ "$a" -gt "$b" ]: 判断 a 的值是否大于 b 的值。
  • [ "$a" -lt "$b" ]:判断 a 的值是否小于 b 的值。
  • 由于 a=15 和 b=20,二者值不同,因此第一个分支条件不成立,于是程序会去到第二个分支判断a是否大于b,但a也不大于b,因此程序会去到第三个分支,去判断a是否小于b,很显然a小于b,因此程序输出的结果就是a < b。
  • 如果上述条件均不满足,程序会去到else分支,输出”没有符合上述的条件!“。

输出 

a < b

文件判断:
  • -e:文件存在
  • -f:存在且是普通文件
  • -d:存在且是目录
  • -r:文件可读
  • -w:文件可写
  • -x:文件可执行
#! /usr/bin/bash
  
file1=./7.0.0.tar.gz
file2=./ProxyCat-main
file3=./1.txt
if [ -e "$file1" ]; then
        echo "文件存在"
fi

if [ -f "$file3" ]; then
        echo "文件存在且是普通文件"
fi

if [ -d "$file2" ]; then
        echo "文件存在且是目录"
fi

if [ -r "$file1" ]; then
        echo "文件可读"
else
        echo "该文件没有读取权限!"
fi

if [ -w "$file1" ]; then
        echo "文件可写"
else
        echo "该文件没有写入权限!"
fi

if [ -x "$file1" ]; then
        echo "文件可执行"
else
        echo "该文件没有执行权限!"
fi
代码解析:
1. 变量定义
file1=./7.0.0.tar.gz 
file2=./ProxyCat-main 
file3=./1.txt

定义三个变量 file1file2file3,分别表示三个路径:

  • file1:文件路径 ./7.0.0.tar.gz
  • file2:目录路径 ./ProxyCat-main
  • file3:普通文件路径 ./1.txt
2. 检查文件是否存在
if [ -e "$file1" ]; then 
    echo "文件存在" 
fi
  • -e: 判断文件(或目录)是否存在。
  • 如果 file1 存在,无论是文件还是目录,输出 "文件存在"

因为文件 7.0.0.tar.gz 存在所以输出结果为:

文件存在
3. 检查是否是普通文件
if [ -f "$file3" ]; then 
    echo "文件存在且是普通文件" 
fi
  • -f: 判断路径是否为普通文件。
  • 如果 file3 是普通文件(非目录或特殊设备文件),输出 "文件存在且是普通文件"

因为文件 1.txt 存在且是普通文件所以输出结果为:

文件存在且是普通文件
4. 检查是否是目录
if [ -d "$file2" ]; then 
    echo "文件存在且是目录" 
fi
  • -d: 判断路径是否为目录。
  • 如果 file2 是目录,输出 "文件存在且是目录"

因为文件ProxyCat-main存在且是是目录所以输出结果为:

文件存在且是目录
5. 检查文件是否可读
if [ -r "$file1" ]; then 
    echo "文件可读" 
else 
    echo "该文件没有读取权限!" 
fi
  • -r: 判断文件是否有读取权限。
  • 如果 file1 可读,输出 "文件可读"。否则,输出 "该文件没有读取权限!"

因为 7.0.0.tar.gz 具备可读权限所以输出结果为:

文件可读
6. 检查文件是否可写
if [ -w "$file1" ]; then 
    echo "文件可写" 
else 
    echo "该文件没有写入权限!" 
fi
  • -w: 判断文件是否有写入权限。
  • 如果 file1 可写,输出 "文件可写"。否则,输出 "该文件没有写入权限!"

因为 7.0.0.tar.gz 不具备写入权限所以输出结果为:

该文件没有写入权限!
7. 检查文件是否可执行
if [ -x "$file1" ]; then 
    echo "文件可执行" 
else 
    echo "该文件没有执行权限!" 
fi
  • -x: 判断文件是否有执行权限。
  • 如果 file1 可执行,输出 "文件可执行"。否则,输出 "该文件没有执行权限!"

因为 7.0.0.tar.gz 不具备执行权限所以输出结果为:

该文件没有执行权限!

二、for循环结构

for 循环用于遍历列表或范围中的元素。语法如下:

for 变量 in 列表;
do
    # 循环体
done

在do和done之间的是每次循环需要执行的动作,也叫循环体

示例

示例
1.遍历列表
#! /usr/bin/bash
  
for day in Monday Tuesday Wednesday Thursday Friday;

do
        echo "当前是$day"

done
运行逻辑
for day in Monday Tuesday Wednesday Thursday Friday
  • 定义循环变量 day,其值依次为 MondayTuesdayWednesdayThursdayFriday
  • 每次循环,将当前的 day 值赋给循环体中的 day
echo "当前是$day"
  • 输出当前变量 day 的值。
done
  • for循环结束的关键字,它标志着整个for循环过程结束
输出结果
当前是Monday
当前是Tuesday
当前是Wednesday
当前是Thursday
当前是Friday
2.遍历数字范围
#! /usr/bin/bash
for i in {1..5};

do
        echo "当前数字是$i"

done
运行逻辑
for i in {1..5}
  • {1..5} 表示从数字 15 的一个范围,定义的循环变量 i,依此取值为1,2,3,4,5。
  • 定义的循环变量 i,每次循环的取值为1,2,3,4,5
echo "当前数字是$i"
  • 输出当前变量 i 的值。
done
  • for循环结束的关键字,它标志着整个for循环过程结束
输出结果
当前数字是1
当前数字是2
当前数字是3
当前数字是4
当前数字是5
3.遍历文件
#! /usr/bin/bash
for file in *;

do
    echo "当前文件是:$file"

done
运行逻辑
for file in *
  • * 通配符,匹配当前目录下的所有文件和子目录的名称
  • 定义的循环变量file每次循环会去取一个匹配的文件或目录名称。
echo "当前文件是:$file"
  • 输出当前变量 file的值。
done
  • for循环结束的关键字,它标志着整个for循环过程结束
输出结果
当前文件是1.txt
当前文件是7.0.0.tar.gz
当前文件是docker-compose-linux-x86_64.1
当前文件是g.sh
当前文件是install.sh
当前文件是k.sh
当前文件是ProxyCat-main
当前文件是ProxyCat.zip
当前文件是redis-7.0.0
当前文件是vulfocus
当前文件是y.sh
4.遍历通过 seq 生成范围
#! /usr/bin/bash
for num in $(seq 1 2 20);

do
        echo "当前数字是$num"

done 
运行逻辑
for num in $(seq 1 2 20)
  • seq 1 2 20:

    • seq 是一个用于生成序列的命令。
    • 语法:seq 起始值 步长 结束值。
    • 在此,seq 1 2 20 会生成一个从 1 开始,每次增加 2,直到不超过 20 的数字序列。
  • for num in $(...)

    • 使用 $(...) 命令替换语法,将 seq 命令的输出作为循环变量的取值。
    • 每次循环,num 依次取 seq 输出的值。
echo "当前数字是$num"
  • 输出当前变量 num的值。
done
  • for循环结束的关键字,它标志着整个for循环过程结束
输出结果
当前数字是1
当前数字是3
当前数字是5
当前数字是7
当前数字是9
当前数字是11
当前数字是13
当前数字是15
当前数字是17
当前数字是19
5.双(())for循环
for ((a=1;a<10;a++));

do
    echo $a

done
运行逻辑
for ((a=1;a<10;a++))
  • a=1,定义循环变量 a 的初始值为 1
  • a<10,每次循环开始时,检查条件 a<10 是否成立。如果条件为 true,进入循环体;否则退出循环。
  • a++,每次循环结束后,变量 a 的值增加 1
echo $a
  • 输出变量 a 的当前值。 
输出结果
1 
2 
3 
4 
5 
6 
7 
8 
9

;