泷羽sec-shell(6)if条件判断与for循环结构 学习笔记

声明! 学习视频来自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

创建文件16.sh

  1. for num in 1 2 3 4 5

  2. do

  3. echo "the number is $num"

  4. 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 之后的代码(如果有的话)。

相关推荐
爱煲汤的夏二3 分钟前
《山海经》:北山
笔记
济南小草根20 分钟前
RabbitMQ学习-Eight
分布式·学习·rabbitmq
DreamByter24 分钟前
Day4:生信新手笔记 — R语言简单命令与Rstudio配置
开发语言·笔记·r语言
名字不要太长 像我这样就好40 分钟前
【iOS】《Effective Objective-C 2.0》阅读笔记(一)
开发语言·笔记·学习·macos·ios·objective-c
小康师兄1 小时前
【软考速通笔记】系统架构设计师⑯——通信系统架构设计
笔记·系统架构·系统架构师·局域网·通信系统·广域网·软件定义网络
小萌新~~~~1 小时前
在Scala中Array不可变的学习
开发语言·学习·scala
亦枫Leonlew1 小时前
微积分复习笔记 Calculus Volume 2 - 3.3 Trigonometric Substitution
笔记·数学·微积分
general_pp2 小时前
【Java笔记】第十六章:多线程
java·开发语言·笔记
m0_726965983 小时前
Android笔记【12】脚手架Scaffold和导航Navigation
android·笔记