shell脚本(6)

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

感谢泷羽sec 团队 的教学

视频地址:shell(6)if条件判断与for循环结构_哔哩哔哩_bilibili

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

一、if语句

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

bash 复制代码
if [ 条件 ]; then
    # 条件成立时执行的代码
elif [ 条件 ]; then
    # 条件不成立但满足 elif 的代码
else
    # 所有条件都不满足时执行的代码
fi
整数比较:
bash 复制代码
#! /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. 变量定义
bash 复制代码
a=15 
b=20
  • a: 赋值为15。
  • b: 赋值为20。
2. 判断两个字符串是否相等
bash 复制代码
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" -lt "$b" \]:判断 a 的值是否小于 b 的值。

  • 如果上述条件均不满足,程序会去到else分支,输出"没有符合上述的条件!"。

输出

bash 复制代码
a < b
文件判断:
  • -e:文件存在
  • -f:存在且是普通文件
  • -d:存在且是目录
  • -r:文件可读
  • -w:文件可写
  • -x:文件可执行
bash 复制代码
#! /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. 变量定义
bash 复制代码
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. 检查文件是否存在
bash 复制代码
if [ -e "$file1" ]; then 
    echo "文件存在" 
fi
  • -e: 判断文件(或目录)是否存在。
  • 如果 file1 存在,无论是文件还是目录,输出 "文件存在"

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

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

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

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

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

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

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

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

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

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

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

bash 复制代码
该文件没有执行权限!

二、for循环结构

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

bash 复制代码
for 变量 in 列表;
do
    # 循环体
done

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

示例

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

do
        echo "当前是$day"

done
运行逻辑
bash 复制代码
for day in Monday Tuesday Wednesday Thursday Friday
  • 定义循环变量 day,其值依次为 MondayTuesdayWednesdayThursdayFriday

  • 每次循环,将当前的 day 值赋给循环体中的 day

    echo "当前是$day"

  • 输出当前变量 day 的值。

    done

  • for循环结束的关键字,它标志着整个for循环过程结束

输出结果
复制代码
当前是Monday
当前是Tuesday
当前是Wednesday
当前是Thursday
当前是Friday
2.遍历数字范围
bash 复制代码
#! /usr/bin/bash
for i in {1..5};

do
        echo "当前数字是$i"

done
运行逻辑
bash 复制代码
for i in {1..5}
  • {1..5} 表示从数字 15 的一个范围,定义的循环变量 i,依此取值为1,2,3,4,5。
  • 定义的循环变量 i,每次循环的取值为1,2,3,4,5
bash 复制代码
echo "当前数字是$i"
  • 输出当前变量 i 的值。

    done

  • for循环结束的关键字,它标志着整个for循环过程结束

输出结果
bash 复制代码
当前数字是1
当前数字是2
当前数字是3
当前数字是4
当前数字是5
3.遍历文件
bash 复制代码
#! /usr/bin/bash
for file in *;

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

done
运行逻辑
bash 复制代码
for file in *
  • * 通配符,匹配当前目录下的所有文件和子目录的名称
  • 定义的循环变量file每次循环会去取一个匹配的文件或目录名称。
bash 复制代码
echo "当前文件是:$file"
  • 输出当前变量 file的值。

    done

  • for循环结束的关键字,它标志着整个for循环过程结束

输出结果
bash 复制代码
当前文件是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 生成范围
bash 复制代码
#! /usr/bin/bash
for num in $(seq 1 2 20);

do
        echo "当前数字是$num"

done 
运行逻辑
bash 复制代码
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 输出的值。
bash 复制代码
echo "当前数字是$num"
  • 输出当前变量 num的值。

    done

  • for循环结束的关键字,它标志着整个for循环过程结束

输出结果
bash 复制代码
当前数字是1
当前数字是3
当前数字是5
当前数字是7
当前数字是9
当前数字是11
当前数字是13
当前数字是15
当前数字是17
当前数字是19
5.双(())for循环
bash 复制代码
for ((a=1;a<10;a++));

do
    echo $a

done
运行逻辑
bash 复制代码
for ((a=1;a<10;a++))
  • a=1,定义循环变量 a 的初始值为 1
  • a<10,每次循环开始时,检查条件 a<10 是否成立。如果条件为 true,进入循环体;否则退出循环。
  • a++,每次循环结束后,变量 a 的值增加 1
bash 复制代码
echo $a
  • 输出变量 a 的当前值。
输出结果
bash 复制代码
1 
2 
3 
4 
5 
6 
7 
8 
9
相关推荐
爱喝水的鱼丶10 分钟前
SAP-ABAP: ABAP ASSIGN COMPONENT 语句详解:动态字段符号的利器作用用法示例详解
运维·开发语言·sap·abap·开发经验·动态字段符号
FLS16812 分钟前
Kali搭建sqli-labs靶场
linux·sql·安全·网络安全
清寒敲代码22 分钟前
k8s核心技术-Helm
运维·容器·kubernetes
quqi9922 分钟前
Enable FIPS in ubuntu (by quqi99)
linux·运维·ubuntu
不是三毛没有半28 分钟前
华为USG6000v2 NAT模式下IPSEC IKE V1 实验
网络·网络安全·华为
人工智能训练师28 分钟前
在Ubuntu中如何使用PM2来运行一个编译好的Vue项目
linux·运维·服务器·vue.js·ubuntu·容器
程序媛Dev35 分钟前
50.4k Star!我用这个神器,在五分钟内搭建了一个私有 Git 服务器!
运维·服务器·git
zhongwenhua52040 分钟前
ZeroMQ 编译 & 项目使用流程文档
linux·zmq
KKKlucifer1 小时前
网络安全等级保护:等级保护工作、分级保护工作、密码管理工作三者之间的关系
网络·安全·web安全
Lynnxiaowen2 小时前
今天继续学习shell脚本
linux·运维·学习·云计算·bash