声明! 学习视频来自B站up主 **泷羽sec** 有兴趣的师傅可以关注一下,如涉及侵权马上删除文章,笔记只是方便各位师傅的学习和探讨,文章所提到的网站以及内容,只做学习交流,其他均与本人以及泷羽sec团队无关,切勿触碰法律底线,否则后果自负!!!!有兴趣的小伙伴可以点击下面连接进入b站主页[B站泷羽sec](泷羽sec的个人空间-泷羽sec个人主页-哔哩哔哩视频)
本章课程链接:shell(6)if条件判断与for循环结构_哔哩哔哩_bilibili
if的基本概念
在 Shell 脚本中,if条件判断用于根据不同的条件执行不同的命令块。它允许脚本根据条件的真假来决定程序的流程走向。
条件判断可以基于各种因素,如文件是否存在、变量的值、命令的执行结果等。
基本语法结构
最基本的if语句结构如下:
if [ condition ]; then
commands
fi
其中,[ condition ]是条件表达式,它必须被方括号包围,并且在方括号内部的条件表达式两边要有空格。then关键字后面跟着当条件为真时要执行的命令块,fi是if语句的结束标志。
例如,判断一个变量num是否大于 10:
num=15
if [ $num -gt 10 ]; then
echo "The number is greater than 10"
fi
条件表达式类型
文件测试条件
可以测试文件的各种属性。例如,-e用于测试文件是否存在,-f用于测试是否是普通文件,-d用于测试是否是目录。
示例:
file="/etc/passwd"
if [ -e $file ]; then
echo "The file $file exists."
else
echo "The file $file does not exist."
fi
数值比较条件
用于比较两个数值的大小关系。如-eq(等于)、-ne(不等于)、-lt(小于)、-le(小于等于)、-gt(大于)、-ge(大于等于)。
注意,在进行数值比较时,变量的引用方式要正确,并且要保证是数值类型的比较。例如:
a=5
b=3
if [ $a -gt $b ]; then
echo "a is greater than b"
fi
字符串比较条件
可以比较字符串是否相等(==或=)、是否不等(!=),还可以测试字符串的长度是否为 0(-z)等。
例如,比较两个字符串是否相等:
str1="hello"
str2="world"
if [ $str1!= $str2 ]; then
echo "The two strings are not equal."
fi
if - else和if - elif - else结构
if - else结构
当if条件不满足时,可以使用else分支来执行另外一组命令。语法如下:
if [ condition ]; then
commands1
else
commands2
fi
例如,判断一个数是偶数还是奇数:
num=7
if [ $(($num % 2)) -eq 0 ]; then
echo "The number is even."
else
echo "The number is odd."
fi
if - elif - else结构
当有多个条件需要依次判断时,可以使用elif(是else if的缩写)。语法如下:
if [ condition1 ]; then
commands1
elif [ condition2 ]; then
commands2
else
commands3
fi
例如,根据成绩等级输出评价:
score=75
if [ $score -ge 90 ]; then
echo "Excellent"
elif [ $score -ge 80 ]; then
echo "Good"
elif [ $score -ge 60 ]; then
echo "Pass"
else
echo "Fail"
fi
if判断符号
大于 -gt (greater than)检查左边的数值是否大于右边的数值
a=7
b=5
if [ $a -gt $b ]; then
echo "a大于b"
fi
小于 -lt (less than)用于判断左边的数值是否小于右边的数值
a=3
b=5
if [ $a -lt $b ]; then
echo "a小于b"
fi
大于或等于 -ge (greater than or equal)
a=5
b=5
if [ $a -ge $b ]; then
echo "a大于等于b"
fi
小于或等于 -le (less than or equal)
a=3
b=3
if [ $a -le $b ]; then
echo "a小于等于b"
fi
不相等 -ne (not equal)判断两个数值是否不相等。
a=3
b=5
if [ $a -ne $b ]; then
echo "a不等于b"
fi
相等 -eq (equal)用于判断两个数值是否相等。
a=5
b=5
if [ $a -eq $b ]; then
echo "a等于b"
fi
字符串比较运算符
=(等于):用于判断两个字符串是否相等
=(不等于):判断两个字符串是否不相等。
-z(字符串长度为零):检查字符串是否为空
文件测试运算符
-e(文件或目录存在):用于判断文件或目录是否存在
file="test.txt"
if [ -e $file ]; then
echo "文件存在"
fi
-f(文件存在且为普通文件):检查是否是一个普通文件存在
file="test.txt"
if [ -f $file ]; then
echo "是普通文件且存在"
fi
-d(目录存在):用于判断目录是否存在。
dir="mydir"
if [ -d $dir ]; then
echo "目录存在"
fi
-r(文件或目录可读):检查文件或目录是否可读。
file="test.txt"
if [ -r $file ]; then
echo "文件可读"
fi
-w(文件或目录可写):用于判断文件或目录是否可写
file="test.txt"
if [ -w $file ]; then
echo "文件可写"
fi
-x(文件或目录可执行):检查文件或目录是否可执行。
file="test.sh"
if [ -x $file ]; then
echo "文件可执行"
fi
for循环结构
在 Shell 脚本中,for循环用于遍历一系列的值,例如列表中的元素、文件中的行等。它允许你对一组数据中的每个元素执行相同的操作,从而避免了重复编写相似的代码。
基本语法结构
最常见的语法形式如下:
for variable in list; do
commands
done
其中,variable是一个变量,在每次循环迭代时,它会被赋予list中的一个值。list可以是一个用空格分隔的值列表,也可以是一个由命令生成的结果列表。do后面跟着要在每次循环中执行的命令块,done标志着for循环的结束。
例如,遍历一个数字列表并打印每个数字:
for i in 1 2 3 4 5; do
echo $i
done
不同类型的列表遍历
遍历数字序列
可以使用{start..end}的形式来生成一个数字序列。例如,要遍历从 1 到 10 的数字:
for i in {1..10}; do
echo $i
done
还可以指定步长,如{start..end..step}。例如,要遍历 1 到 10 之间的奇数(步长为 2):
for i in {1..10..2}; do
echo $i
done
遍历文件列表
可以使用通配符来遍历符合特定模式的文件。例如,要遍历当前目录下所有的.txt文件:
for file in *.txt; do
echo $file
done
也可以使用find等命令来生成文件列表,然后在for循环中遍历。例如:
file_list=$(find /path/to/directory -type f)
for file in $file_list; do
echo $file
done
- **遍历命令输出结果**
- 很多命令的输出结果可以作为`for`循环的列表。例如,`ls`命令输出当前目录下的文件和目录名。
```bash
for dir in $(ls -d */); do
echo $dir
done
这里ls -d */输出当前目录下的所有子目录名,for循环会逐个遍历这些子目录名。
嵌套的for循环
就像其他编程语言一样,Shell 中的for循环也可以嵌套。例如,要打印九九乘法表:
for i in {1..9}; do
for j in {1..9}; do
result=$((i * j))
echo -n "$i x $j = $result "
done
echo
done
外层for循环控制行数(从 1 到 9),内层for循环控制每行中的列数(也是从 1 到 9)。在每次内层循环中,计算乘法结果并打印,通过echo -n可以不换行打印,当内层循环结束后,使用echo换行,开始下一行的打印。
实例
if实例1
创建 15.sh的脚本
#!/bin/bash
定义变量
a=10
b=20
进行条件判断
if [ "a" -eq "b" ]; then
echo "a=b"
elif [ "a" -gt "b" ]; then
echo "a>b"
else
echo "没有符合上述条件"
fi
声明变量a/b,判断:变量A和变量B相等,则输出:A=B,判断:变量A>B则输出,否则输出没有上述情况
if实例2
定义变量
a=10
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
for实例1
for num in 1 2 3 4 5
do
echo "the number is $num"
done
for num in 1 2 3 4 5:这是for循环的起始部分。这里定义了一个循环变量num,并且指定了要遍历的列表,在这个例子中,列表就是由数字1、2、3、4、5组成的。循环会依次将列表中的每个元素赋值给变量num。
do:标志着循环体的开始,在do和与之匹配的done之间的代码就是每次循环要执行的操作。
echo "the number is num":这是循环体内部的代码。它使用echo命令来输出一段文本信息,其中num是一个变量引用,会被替换为当前循环中num变量所赋的值。也就是说,每次循环时,这里会输出类似"the number is 1"、"the number is 2"等等这样的内容,具体取决于当前循环中num所取到的值。
done:标志着for循环体的结束,当循环遍历完列表中的所有元素后,程序就会继续执行done之后的代码(如果有的话)
for实例2
创建17.sh文件
for str in "hello wold"
do
echo $str
done
for str in "hello world":这是 for 循环的起始部分。这里定义了一个循环变量 str,并且指定了要遍历的字符串 "hello world"。循环会按照空格将字符串分割成一个个单词,然后依次将每个单词赋值给变量 str。
do:标志着循环体的开始,在 do 和与之匹配的 done 之间的代码就是每次循环要执行的操作。
echo $str:这是循环体内部的代码。它使用 echo 命令来输出当前循环中变量 str 的值,也就是会依次输出字符串 "hello world" 被分割后的每个单词,即先输出 "hello",然后下一次循环输出 "world"。
done:标志着 for 循环体的结束,当循环遍历完字符串中所有以空格分隔的单词后,程序就会继续执行 done 之后的代码(如果有的话)。