声明:学习视频来自b站up主 泷羽sec,如涉及侵权马上删除文章
感谢泷羽sec 团队 的教学
本文主要讲解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" -gt "b" ]: 判断 a 的值是否大于 b 的值。
- [ "a" -lt "b" ]:判断 a 的值是否小于 b 的值。
- 由于 a=15 和 b=20,二者值不同,因此第一个分支条件不成立,于是程序会去到第二个分支判断a是否大于b,但a也不大于b,因此程序会去到第三个分支,去判断a是否小于b,很显然a小于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
定义三个变量 file1
、file2
和 file3
,分别表示三个路径:
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
,其值依次为Monday
、Tuesday
、Wednesday
、Thursday
和Friday
。 -
每次循环,将当前的
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}
表示从数字1
到5
的一个范围,定义的循环变量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