声明:学习视频来自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 
定义三个变量 file1、file2 和 file3,分别表示三个路径:
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,其值依次为Monday、Tuesday、Wednesday、Thursday和Friday。 - 每次循环,将当前的 
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}表示从数字1到5的一个范围,定义的循环变量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 



















