Shell 编程之条件语句

目录

条件测试操作

        文件测试

        整数值比较

        字符串比较

        逻辑测试

if 条件语句

        if语句的结构

        1、单分支 if 语句

        2、双分支 if 语句

        3、多分支 if 语句

        if语句应用实例

        1、单分支 if 语句应用

        2、双分支 if 语句应用

        3、多分支 if 语句应用

case 分支语句

        case语句的结构

        case语句应用实例

        1、检查用户输入的字符类型

        2、编写系统服务脚本


条件测试操作

        要使 she11 脚本程序具备一定的“智能”,面临的第一个问题就是如何区分不同的情况以确定执行何种操作。例如,当磁盘使用率超过 95%时,发送告警信息;当备份目录不存在时,能够自动创建;当源码编译程序时,若配置失败则不再继续安装等。

        shel1 环境根据命令执行后的返回状态值($?)来判断是否执行成功,当返回值为 8 时表示成功,否则(非 6 值)表示失败或异常。使用专门的测试工具-test 命令,可以对特定条件进行测试,并根据返回值来判断条件是否成立(返回值为8表示条件成立)。

        使用test测试命令时,包括以下两种形式。

test  条件表达式

[  条件表达式  ]

        这两种方式的作用完全相同,但通常后一种形式更为常用,也更贴近编程习惯。需要注意的是,方括号“[”或“]”与条件表达式之间需要至少一个空格进行分隔。

         根据需要测试的条件类别不同,条件表达式也不同。比较常用的条件操作包括文件测试、整数值比较、字符串比较,以及针对多个条件的逻辑测试,下面分别进行介绍。

        文件测试

        文件测试指的是根据给定的路径名称,判断对应的是文件还是目录,或者判断文件是否可读、可写、可执行等。文件测试的常见操作选项如下,使用时将测试对象放在操作选项之后即可。

  • -d:测试是否为目录(Directory)。
  • -e:测试目录或文件是否存在(Exist)。
  • -f:测试是否为文件(File)。
  • -r:测试当前用户是否有权限读取(Read)。
  • -w:测试当前用户是否有权限写入(write)。
  • -x:测试是否设置有可执行(Excute)权限。

         执行条件测试操作以后,通过预定义变量$?可以获得测试命令的返回状态值,从而判断该条件是否成立。例如,执行以下操作可测试目录/media/是否存在,如果返回值$?为 ,表示存在此目录,否则表示不存在或者虽然存在但不是目录。

[root@localhost ~]#[ -d /media/ ]
[root@localhost ~]# echo $?    //查看前一命令的返回值
0            //返回 0 表示条件成立

         若测试的条件不成立,则测试操作的返回值将不为 0(通常为 1)。例如,执行以下操作展示了测试不存在目录的情况。

[root@localhost ~]#[ -d /media/cdrom/Server ]
[root@localhost ~]# echo $?    //查看前一命令的返回值
1            //返回 1 表示条件不成立

         通过查看变量$?的值可以判断前一步的条件测试结果,但是操作比较烦琐,输出结果也并不是很直观。为了更直观地査看测试结果,可以结合命令分隔符“&&”和 echo 命令一起使用,当条件成立时直接输出“YES”。其中,“&8”符号表示“而且”的关系,只有当前面的命令执行成功后才会执行后面的命令,否则后面的命令将会被忽略。例如,上述目录测试操作可以改写如下。

[root@localhost ~]#[ -d /media/cdrom/Server ] && echo "YES"
//无输出表示该目录不存在[root@localhost ~]#[ -d /media/cdrom ]&& echo "YEs"
//输出"YES"表示该目录存在
YES

        整数值比较

        整数值比较指的是根据给定的两个整数值,判断第一个数与第二个数的关系,如是否大于、等于、小于第二个数。整数值比较的常用操作选项如下,使用时将操作选项放在要比较的两个整数之间。

  • -eq:第一个数等于(Equa1)第二个数。
  • -ne:第一个数不等于(Not Equal)第二个数。
  • -gt:第一个数大于(Greater Than)第二个数。
  • -lt:第一个数小于(Lesser Than)第二个数。
  • -le:第一个数小于或等于(Lesser or Equal)第二个数。
  • -ge:第一个数大于或等于(Greater or Equal)第二个数。

         整数值比较在 She11 脚本编写中的应用较多。例如,用来判断已登录用户数量、开启进程数、磁盘使用率是否超标,以及软件版本号是否符合要求等。实际使用时,往往会通过变量引用、命令替换等方式来获取一个数值。

        如下:若要判断当前已登录的用户数,当超过五个时输出“Too many.”,可以执行以下操作。其中,已登录用户数可通过“who|wc -1”命令获得,以命令替换方式嵌入。

[root@localhost ~]#Unum=`whowc -1`             //查看当前已登录用户数
[root@localhost ~]#[ $Unum -gt 5 ]&& echo "Too many."        //测试结果(大于)
Too many

        又如,若要判断物理内存(Mem)当前的磁盘缓存(buff/cache)大小,当低于 1024MB 时输出具体数值,可以执行以下操作。其中,“free -m”命令表示以 MB 为单位输出内存信息,提取的空闲内存数值通过命令替换赋值给变量 Freecc。

[root@localhost ~]# Freecc=$(free -m|grep "Mem:" awk '{print $6}')
[root@localhost ~]#[ $Freecc -lt 1024 ]&& echo ${Freecc}MB
275MB

        字符串比较

        字符串比较通常用来检査用户输入、系统环境等是否满足条件,在提供交互式操作的 shel1 脚本中,也可用来判断用户输入的位置参数是否符合要求。字符串比较的常用操作选项如下。

  •  =:第一个字符串与第二个字符串相同。
  • !=:第一个字符串与第二个字符串不相同,其中“!”符号表示取反。
  • -z:检查字符串是否为空(Zero),对于未定义或赋予空值的变量将视为空串。

         如下,若要判断当前系统的语言环境,当发现不是“en.us”时输出提示信息“Not en.us”,可以
共执行以下操作。

[root@localhost ~]# echO $LANG
//查看当前的语言环境
zh_CN.UTF-8[root@localhost ~]#[ $LANG != "en.us" ]&& echo "Not en.us"
//字符串测试结果(不等于)
Not en.Us

        又如, 在 shel1 脚本应用中,经常需要用户输入“yes”或“no”来确认某个任务。以下操作展示了确认交互的简单过程,当然,实际使用时还会根据变量“ACK”的取值分别执行进一步的操作。

[root@localhost ~]# read -p"是否覆盖现有文件(yes/no)?" ACK
是否覆盖现有文件(yes/no)?yes[root@localhost ~]#[ $ACK="yes"]&& echo“覆盖”覆盖
[root@localhost ~]# read -p"是否覆盖现有文件(yes/no)?" ACK
是否覆盖现有文件(yes/no)?no
[root@localhost ~]#[ $ACK="no"]&& echo"不覆盖”不覆盖

        逻辑测试

        逻辑测试指的是判断两个或多个条件之间的依赖关系。当系统任务取决于多个不同的条件时,根据这些条件是否同时成立或者只要有其中一个成立等情况,需要有一个测试的过程。常用的逻辑测试操作如下,使用时放在不同的测试语句或命令之间。

  • &&:逻辑与,表示“而且”,只有当前后两个条件都成立时,整个测试命令的返回值才为 0(结果成立)。使用 test 命令测试时,“&&”可改为“-a”。
  • ||:逻辑或,表示“或者”,只要前后两个条件中有一个成立,整个测试命令的返回值即为 0(结果成立)。使用 test 命令测试时,“|”可改为“-0”。
  • !:逻辑否,表示“不”,只有当指定的条件不成立时,整个测试命令的返回值才为 0(结果成立)。

         在上述逻辑测试的操作选项中,“&&”和“|”通常也用于间隔不同的命令操作,其作用是相似的。实际上此前已经接触过“&8”操作的应用,如“make&& make insta11”的编译安装操作。

        如下,若要判断当前 Linux 系统的内核版本是否大于 3.4,可以执行以下操作。其中,内核版本号通过 uname 和 awk 命令获得。

[root@localhost ~]# uname -r //査看内核版本信息
3.10.0-514.e17.x86 64[root@localhost ~]# Mnum=$(uname -r| awk -F.'{print $1}')//取主版本号
[root@localhost ~]# Snum=$(uname -r|awk -f.'{print $2}')//取次版本号
[root@localhost ~]#[$Mnum-ge3]&&[$Snum -gt 4]&& echo"符合要求”符合要求

if 条件语句

        实际上使用“&&”和“|”逻辑测试已经可以完成简单的判断并执行相应的操作,但是当需要选择执行的命令语句较多时,这种方式将使执行代码显得很复杂,不好理解。而使用专用的 if 条件语句,可以更好地整理脚本结构,使得层次分明,清晰易懂。

        if语句的结构

        在 she11 脚本应用中,if 语句是最为常用的一种流程控制方式,用来根据特定的条件测试结果,分别执行不同的操作(如果.……那么…)。根据不同的复杂程度,if 语句的选择结构可以分为三种基本类型。适用于不同的应用场合。

        1、单分支 if 语句

        if 语句的“分支”指的是不同测试结果所对应的执行语句(一条或多条)。对于单分支的选择结构,只有在“条件成立”时才会执行相应的代码,否则不执行任何操作。单分支 if 语句的语法格式如下所示。

if 条件测试操作
then命令序列
fi

         在上述语句结构中,条件测试操作既可以是“[条件表达式]”语句,也可以是其他可执行的命令语句,命令序列指的是一条或多条可执行的命令行,也包括嵌套使用的 if 语句或其他流程控制语句。
        单分支 if 语句的执行流程:首先判断条件测试操作的结果,如果返回值为 0,表示条件成立,执行then 后面的命令序列,一直到遇见 fi 结束判断为止,继续执行其他脚本代码;如果返回值不为 6,则忽略 then 后面的命令序列,直接跳至 fi 行以后执行其他脚本代码,如下图所示。

        2、双分支 if 语句

        对于双分支的选择结构,要求针对“条件成立”“条件不成立”两种情况分别执行不同的操作。双分支 if 语句的语法格式如下所示。

if 条件测试操作
then命令序列 1
else命令序列 2
fi

         双分支 if 语句的执行流程:首先判断条件测试操作的结果,如果条件成立,则执行 then 后面的命令序列 1,忽略 else 及后面的命令序列 2,直到遇见 fi 结束判断;如果条件不成立,则忽略 then 及后面的命令序列 1,直接跳至 else 后面的命令序列 2 并执行,直到遇见 fi 结束判断,如下图 所示。

        3、多分支 if 语句

        由于 if 语句可以根据测试结果的成立、不成立分别执行操作,所以能够嵌套使用,进行多次判断。例如,首先判断某学生的得分是否及格,若及格则再次判断是否高于 90 分等。多分支 if 语句的语法格式如下。

if 条件测试操作 1
then命令序列 1
elif 条件测试操作 2
then命令序列 2
else命令序列 3
fi

         上述语句结构中只嵌套了一个 elif 语句作为示例,实际上可以嵌套多个。if 语句的嵌套在编写She11 脚本时并不常用,因为多重嵌套容易使程序结构变得复杂。当确实需要使用多分支的程序结构时,采用下一节的 case 语句更加方便。

        多分支 if 语句的执行流程:首先判断条件测试操作1 的结果,如果条件 1 成立,则执行命令序列1,然后跳至 fi 结束判断;如果条件 1 不成立,则继续判断条件测试操作 2 的结果,如果条件 2 成立,则执行命令序列 2,然后跳至 fi 结束判断……如果所有的条件都不满足,则执行 else 后面的命令序列n,直到遇见 fi 结束判断,如下图所示。

        if语句应用实例

        为了进一步理解 if 语句结构和流程,掌握 if 语句在 shel1 脚本中的实际使用,下面针对不同分支的 if 语句讲解几个脚本示例。

        1、单分支 if 语句应用

        很多 Linux 用户习惯上将光盘设备挂载到/media/cdrom 目录下,但 Linux 系统默认并没有建立此目录。若需要在 she11 脚本中执行挂载光盘的操作,建议先判断挂载点目录是否存在,若不存在则新建此目录。

[root@localhost ~]# vim chkmountdir.sh
#!/bin/bash
MOUNT DIR="/media/cdrom"
if [ !-d $MOUNT DIR ]
thenmkdir -P $MOUNT_DIR
fi[root@localhost ~]# chmod +x chkmountdir.sh
[root@localhost ~]#./chkmountdir.sh

        如有些特权命令操作要求以 root 用户执行,如果当前用户不是 root,那么再执行这些命令就没有必要(肯定会失败)。针对这种情况,在脚本中可以先判断当前用户是不是root,如果不是则报错并执行“exit 1”命令退出脚本(1 表示退出后的返回状态值),而不再执行其他代码。 

[root@localhost ~]# vim /opt/chkifroot.sh
#!/bin/bash
if [ "$USER" !="root" ]
thenecho "错误!非 root 用户,权限不足! "exit 1
fi
fdisk -l /dev/sda[root@localhost ~]# chmod +x /opt/chkifroot.sh

         当普通用户执行 chkifroot.sh 脚本时,由于“非 root 用户”的条件成立,因此会提示权限不足并退出脚本(使用“exit 1”退出脚本后,fi 之后的 fdisk 命令将不会执行)。

[root@localhost ~]# /opt/chkifroot.sh
错误!非 root 用户,权限不足!

         当 root 用户执行 chkifroot.sh 脚本时,由于“非 root 用户”的条件不成立,所以 if 语句不执行任何操作,正常执行 fi 之后的脚本代码。

[root@localhost ~]# /opt/chkifroot.sh
….//省略部分内容
Device Boot start End Blocks Id System
/dev/sda1 * 2048 40894463 20446208 83 Linux
/dev/sda2 40894464 41943039 524288 82 Linux swap / Solaris

        2、双分支 if 语句应用

         双分支 if 语句只是在单分支的基础上针对“条件不成立”的情况执行另一种操作,而不是“坐视不管”地不执行任何操作。例如,若要编写一个连通性测试脚本 pinghost.sh,通过位置参数$1 提供目标主机地址,然后根据 ping 检测结果给出相应的提示,可以参考以下操作过程。

[root@localhost ~]# vim pinghost.sh
#!/bin/bash
ping -c 3 -i 0.2 -W 3 $1 &>/dev/nul1        //将数据丢给黑洞了 /dev/null
-c  次数  -i 间隔时间 -W 超时 3秒
if [ $? -eq 0 ]
thenecho "Host $1 is up."
elseecho "Host $1 is down."
fi[root@localhost ~]# chmod +x pinghost.sh        //给脚本执行权限

         在上述脚本代码中,为了提高 ping 命令的测试效率,使用了“-c”“-씓-W”选项,分别指定只发送三个测试包、间隔 0.2 秒、超时 3 秒。另外,通过“&>/dev/nu11”屏蔽了 ping 命令执行过程的输出信息。执行 pinghost.sh 脚本的效果如下所示。

[root@localhost ~]# ./pinghost.sh 192.168.10.101    //ping一个运行的主机
Host 192.168.10.101 is up.[root@localhost ~]# ./pinghost.sh 192.168.10.106    //ping一个没有在运行的主机
Host 192.168.10.106 is down.

         例如,通过 shell 脚本检査 vsftpd 服务是否运行,如果已经运行则列出其监听地址、PID 号,否则输出提示“警告:vsftpd 服务不可用!”。其中,pgrep 命令的“-x”选项表示査找时使用精确匹配。

[root@localhost ~]# vim chkvsftpd.sh
#!/bin/bash
systemctl status vsftpd &>/dev/nul1
if [ $? -eq 0 ]
thenecho"监听地址:$(netstat -anpt|grep vsftpd | awk '{print $4}')"echo"进程 PID 号:$(pgrep -x vsftpd)"
elseecho"警告:vsftpd 服务不可用!"
fi[root@localhost ~]# chmod +x chkvsftpd.sh    //给执行的权限

        执行脚本的效果如下:

[root@localhost ~]# ./chkvsftpd.sh
警告:vsftpd 服务不可用!
[root@localhost ~]# systemctl start vsftpd
[root@localhost ~]# ./chkvsftpd.sh
监听地址:::21
进程 PID 号:61003

         3、多分支 if 语句应用

        与单分支、双分支 if 语句相比,多分支 f 语句的结构能够根据多个互斥的条件分别执行不同的操作,实际上等同于嵌套使用的 if 语句。例如,若要编写一个成绩分档的脚本 gradediv.sh,根据输入的考试分数不同来区分优秀、合格、不合格三挡,可以参考以下操作过程。

[root@localhost ~]# vim gradediv.sh
#!/bin/bash
read -p "请输入您的分数(0-100):" GRADE
if [ $GRADE -ge 85 ]&& [ $GRADE -le 100 ]
thenecho“$GRADE 分,优秀!"
elif [ $GRADE -ge 70]&&[ $GRADE -le 84 ]
thenecho"$GRADE 分,合格!"
elseecho“$GRADE 分,不合格!"
fi[root@localhost ~]# chmod +x gradediv.sh        //给脚本执行权限

                执行脚本效果如下:

[root@localhost ~]# ./gradediv.sh请输入您的分数(0-100):67
67 分,不合格![root@localhost ~]# ./gradediv.sh请输入您的分数(0-100):78
78 分,合格![root@localhost ~]# ./gradediv.sh请输入您的分数(0-100): 89
89 分,优秀!

case 分支语句

        case 语句可以使脚本程序的结构更加清晰、层次分明,本节就来学习 case 语句的语法结构及应用。

        case语句的结构

        case 语句主要适用于以下情况:某个变量存在多种取值,需要对其中的每一种取值分别执行不同的命令序列。这种情况与多分支的 if 语句非常相似,只不过 if 语句需要判断多个不同的条件,而 case语句只是判断一个变量的不同取值。

        case 分支语句的语法结构如下所示:

case 变量 in
模式 1)命令序列 1;;            //;;为结束分支
模式 2)命令序列 2;;            //;;为结束分支
* )默认命令序列
esac

        在上述语句结构中,关键字 case 后面跟的是“变量值”,即“$变量名”。整个分支结构包括在case..esac 之间,中间的模式 1、模式 2、…、*对应为变量的不同取值(程序期望的取值),其中*作为通配符,可匹配任意值。

         case 语句的执行流程:首先使用“变量值”与模式 1 进行比较,若取值相同则执行模式 1后的命令序列,直到遇见双分号“;;”后跳转至 esac,表示结束分支;若与模式 1 不相匹配,则继续与模式 2进行比较,若取值相同则执行模式 2后的命令序列,直到遇见双分号“;,”后跳转至 esac,表示结束分支.…依此类推,若找不到任何匹配的值,则执行默认模式“*)”后的命令序列,直到遇见 esac 后结束分支,如下图所示。

        使用 case 分支语句时,有几个值得注意的特点如下所述。

  • case 行尾必须为单词“in”,每一模式必须以右括号“)”结束。
  • 双分号“;;”表示命令序列的结束
  • 模式字符串中,可以用方括号表示一个连续的范围,如“[0-9]”;还可以用竖杠符号“|”表示或,如“A|B”。
  • 最后的“*)”表示默认模式,其中的*相当于通配符。

        case语句应用实例

        为了进一步理解 case 语句的结构和流程,掌握 case 语句在脚本中的实际使用,下面依次介绍两个脚本示例。

        1、检查用户输入的字符类型

        提示用户从键盘输入一个字符,通过 case 语句判断该字符是否为字母、数字或者其他控制字符,并给出相应的提示信息。

[root@localhost ~]# vim hitkey.sh
#!/bin/bash
read -p“请输入一个字符,并按 Enter 键确认:"KEY
case "$KEY" in[a-z]|[A-Z])//匹配任意字母echo“您输入的是 字母,";;[0-9])//匹配任意数字echo"您输入的是 数字.";;*)    //默认模式,匹配任意字符echo"您输入的是 空格、功能键或其他控制字符,"
esac[root@localhost ~]# chmod +x hitkey.sh        //给脚本执行权限

        测试并确认 hitkey.sh 脚本的执行结果如下所示

[root@localhost ~]# ./hitkey.sh
请输入一个字符,并按 Enter 键确认:k        //输入字母 k
您输入的是 字母。[root@localhost ~]# ./hitkey.sh
请输入一个字符,并按 Enter 键确认:8        //输入数字 8
您输入的是 数字.[root@localhost ~]# ./hitkey.sh
请输入一个字符,并按 Enter 键确认:^[[19~    //按 F8 键        //当输入分支里没有的就会报错或者提示
您输入的是 空格、功能键或其他控制字符.

        2、编写系统服务脚本

         编写一个名为 myprog 的系统服务脚本,通过位置变量$1 指定的 start、stop、restart、status控制参数,分别用来启动、停止、重启 sleep 进程,以及査看 sleep 进程的状态。其中,命令 sleep 用来暂停指定秒数的时间,这里仅用做测试,在实际运维工作中应将 sleep 改为相应后台服务的控制命令序列。

[root@localhost ~]# vim myprog
#!/bin/bash
case "$1" in
start)echo -n "正在启动 sleep 服务 ..."if sleep 7200 &then        //在后台启动 sleep 进程echo "oK"fi;;
stop)echo -n "正在停止 sleep 服务 ..." pkill"sleep" &>/dev/nullecho "OK"    //停止 sleep 进程;;
status)if pgrep "sleep"&>/dev/null ;then    //判断并提示 sleep 进程状态echo "sleep 服务已经启动," elseecho "sleep 服务已经停止,"fi;;
restart)    //先停止、再启动服务$0 stop$0 start;;
*)    //默认显示用法信息echo"用法:$0 {start|stop|statuslrestart}"
esac[root@localhost ~]# chmod +x myprog        //给脚本执行权限

        测试并 myprog 脚本的执行结果如下:

[root@localhost ~]# ./myprog start
正在启动 sleep 服务...OK[root@localhost ~]# ./myprog status
sleep 服务已经启动.[root@localhost ~]# ./myprog stop
正在停止 sleep 服务 ... OK、[root@localhost ~]# ./myprog reload
//未提供此参数,按默认处理
用法:./myprog {startlstop|status|restart}

         在 Linux 系统中,源码软件包编译安装后提供的服务控制脚本使用了 case 分支语句;也有一些源码包没有提供服务控制脚本,编译安装后可参照上例自行编写服务控制脚本。平时控制各种系统服务时,供的 start、stop、restart 等位置参数,正是由 case 语句结构来识别并完成相应操作的。有兴趣的同学可自行查阅这些脚本内容。

         若要将 myprog 服务交给 systemd 来管理,还需要在/lib/systemd/system 目录下添加相应的myprog.service 配置文件。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/901082.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【模板】缩点

洛谷p3387 思路: 算法:tarjan算法 根据题意,我们只要找到一个路径,使得最终权重最大即可,首先,根据题目可知,如果一个点在一个环上,那么我们就将这整个环都选上,题目上允许我们能够重复走,因此,我们可以将环缩成点,将环所称点后,就可以转换成树,从没有父节点的结点开始,我们向…

js触发隐式类型转换的场景

JavaScript 的隐式类型转换(Implicit Type Coercion)会在某些操作或上下文中自动触发,将值从一种类型转换为另一种类型。以下是常见的触发场景: 1. 使用 (宽松相等)比较时 会尝试将两边的值转换为相同类型后…

c++将jpg转换为灰度图

c将jpg转换为灰度图 step1:添加依赖 下载这两个文件,放在cpp同一目录下,编译生成 https://github.com/nothings/stb/blob/master/stb_image_write.h https://github.com/nothings/stb/blob/master/stb_image.hstep2:C:\Users\wangrusheng\source\repos…

python——正则表达式

一、简介 在 Python 中,正则表达式主要通过 re 模块实现,用于字符串的匹配、查找、替换等操作。 二、Python的re模块 使用前需要导入: import re 三、常用方法 方法描述re.match(pattern, string)从字符串开头匹配,返回第一个匹…

Soybean Admin 配置vite兼容低版本浏览器、安卓电视浏览器(飞视浏览器)

环境 window10 pnpm 8.15.4 node 8.15.4 vite 5.1.4 soybean admin: 1.0.0 native-ui: 2.38.0 小米电视 MIUI TV版本:MiTV OS 2.7.1886(稳定版) 飞视浏览器:https://www.fenxm.com/1220.html在小米电视安装飞视浏览器可以去小红书查安装教程&#xff1a…

系统与网络安全------网络通信原理(1)

资料整理于网络资料、书本资料、AI,仅供个人学习参考。 文章目录 网络通信模型协议分层计算机网络发展计算机网络功能什么是协议为什么分层邮局实例 OSI模型OSI协议模型OSI七层模型OSI七层的功能简介 TCP/IP模型OSI模型与TCP/IP模型TCP/IP协议族的组成各层PDU设备与…

如何使用通义灵码完成PHP单元测试 - AI辅助开发教程

一、引言 在软件开发过程中,测试是至关重要的一环。然而,在传统开发中,测试常常被忽略或草草处理,很多时候并非开发人员故意为之,而是缺乏相应的测试思路和方法,不知道如何设计测试用例。随着 AI 技术的飞…

批量清空图片的相机参数、地理位置等敏感元数据

我们在使用相机或者手机拍摄照片的时候,照片中都会带有一些敏感元数据信息,比如说相机的型号,参数,拍摄的时间地点等等。这些信息虽说不是那么引人注意,但是在某些时候他是非常隐私非常重要的。如果我们将这些信息泄露…

SQL优化算法解析 | PawSQL 如何将EXISTS子查询“秒拆“为JOIN连接

在数据库性能调优中,子查询优化是提升查询效率的关键点之一。今天,我们将分享一个使用 PawSQL 对EXISTS子查询进行重写优化的案例,展示如何通过合理的SQL重写与索引设计,实现超过487516.45%的性能提升! 一、案例分析:EXISTS子查询的性能困境 这个查询的目的是找出…

大模型day1 - 什么是GPT

什么是GPT 全称 Generative Pre-trained Transformer 是一种基于 Transformer 架构的大规模 预训练 语言模型,由OpenAI研发,但GPT仅仅只是借鉴了Transformer 中 Decoder 的部分,并且做了升级 Transformer 架构 Transformer架构 是一种用于…

MDM功能演示:远程锁定与数据擦除,保障企业移动设备安全

在当今高度互联的商业环境中,企业数据伴随着员工穿梭于不同城市、时区和设备之间。智能手机、平板电脑和笔记本电脑赋予员工随时随地办公的能力,但也带来了新的安全挑战:设备一旦遗失或落入不当之手,企业数据就面临泄露风险。 无…

深度集成学习不均衡样本图像分类

用五个不同的网络,然后对分类概率进行平均,得到分类结果。基本上分类精度可以提升10% 1.导入基本库 import torch import copy import torch.nn as nn import torchvision.models as models from torchvision import datasets from torchvision import…

从零开始学java--泛型

泛型 目录 泛型 引入 泛型类 泛型与多态 泛型方法 泛型的界限 类型擦除 函数式接口 Supplier供给型函数式接口: Consumer消费型函数式接口: Function函数型函数式接口: Predicate断言式函数式接口: 判空包装 引入 …

5️⃣ Coze+AI应用基础教学(2025年全新版本)

目录 一、了解应用开发 1.1 扣子应用能做什么 1.2 开发流程 1.3 开发环境 二、快速搭建一个AI应用 2.1 AI翻译应用介绍 2.2 设计你的应用功能 2.3 创建 AI 应用项目 2.4 编写业务逻辑(新建工作流) 2.5 搭建用户界面 2.6 效果测试 2.7 发布应用 一、了解应用开发 …

工会成立100周年纪念,开发职工健身AI运动小程序、APP方案推荐

时光荏苒,转眼间2025年五一将至,这一年对于中华全国总工会而言,具有非凡的历史意义——它将迎来成立100周年的辉煌时刻。为了庆祝这一盛事,各级工会组织将精心筹备了一系列丰富多彩、形式多样的纪念活动,旨在展现工会百…

【深度学习】Ubuntu 服务器配置开源项目FIGRET(PyTorch、torch-scatter、torch-sparse、Gurobi 安装)

开源项目网址:https://github.com/FIGRET/figret 该项目在SIGCOMM2024发表,用深度学习方法处理流量工程中的突发问题 1. 创建新的 Conda 环境 使用国内镜像源创建环境​ conda create -n figret python3.8.0 --override-channels -c https://mirrors.…

【SpringCloud】从入门到精通(上)

今天主播我把黑马新版微服务课程MQ高级之前的内容都看完了,虽然在看视频的时候也记了笔记,但是看完之后还是忘得差不多了,所以打算写一篇博客再温习一下内容。 课程坐标:黑马程序员SpringCloud微服务开发与实战 微服务 认识单体架构 单体架…

MySQL中动态生成SQL语句去掉所有字段的空格

在MySQL中动态生成SQL语句去掉所有字段的空格 在数据库管理过程中,我们常常会遇到需要对表中字段进行清洗和整理的情况。其中,去掉字段中的空格是一项常见的操作。当表中的字段数量较少时,我们可以手动编写 UPDATE 语句来处理。但如果表中包…

【Grok 大模型深度解析】第二期:架构探秘与训练哲学

在上一期的内容中,我们对 Grok 大模型从技术溯源的角度,了解了它从 Transformer 架构局限性出发,迈向混合架构创新的历程,同时也梳理了从 Grok - 1 到 Grok - 3 的版本迭代所带来的技术跃迁以及其独特的差异化优势。这一期,我们将深入到 Grok 大模型的架构内部,探究其精妙…

c# 使用NPOI将datatable的数据导出到excel

以下是使用 NPOI 库 将 DataTable 数据导出到 Excel 的详细步骤和代码示例(支持 .xls 和 .xlsx 格式): 步骤 1:安装 NPOI NuGet 包 Install-Package NPOI Install-Package NPOI.OOXML # 若需导出 .xlsx 格式 步骤 2:完整代码实现 using NPOI.SS.UserModel; using NPOI.…