清河网站建设电话,网站做优化的必要性,网站建设需要提供的资料,美食推荐网站模板前言 
大家好#xff0c;我是沐风晓月#xff0c;本文首发于csdn#xff0c; 作者: 我是沐风晓月。 文章收录于 我是沐风晓月csdn专栏 【系统架构实战】专栏中的【shell脚本入门到精通】专栏。 
本专栏从零基础带你层层深入#xff0c;学会shell脚本#xff0c;不是梦。 我是沐风晓月本文首发于csdn 作者: 我是沐风晓月。 文章收录于 我是沐风晓月csdn专栏 【系统架构实战】专栏中的【shell脚本入门到精通】专栏。 
本专栏从零基础带你层层深入学会shell脚本不是梦。 个人主页我是沐风晓月 个人简介大家好我是沐风晓月双一流院校计算机专业阿里云博客专家   座右铭 先努力成长自己再帮助更多的人一起加油进步  欢迎大家这里是CSDN我总结知识的地方喜欢的话请三连有问题请私信 文章目录前言一. if条件判断语句1.1 什么是if条件判断语句1.2 常用的测试操作符1.3 if条件判断语句的语法二. if语句常见案例2.1 判断系统目录是否存在if单分支脚本2.2 比较两个整数大小if双分支脚本2.3 判断年龄段if多分支脚本三. 拓展3.1 shell编程中各种括号的对比3.2 shell脚本中各种引号的对比总结一. if条件判断语句 
通常以if开头fi结尾。也可加入else或者elif进行多条件的判断。 1.1 什么是if条件判断语句 
if条件判断语句用于根据某些条件来决定是否执行一段代码块常用的条件有很多比如命令是否执行成功可以用 $? 来判断。 
而这种使用$?判断的结果无非有两个一个是执行成功一个是没有执行成功。 那我们就可以基于这两个条件来加在特定条件下想要执行的命令。 
1.2 常用的测试操作符 文件测试操作  
我们常见的测试工具-test命令这个可以对特定的条件进行测试并根据返回结果来判断条件是否成立。 
语法 
格式一 test 操作符 表达式格式二 [ 操作符 表达式 ]   
常用的文件测试符 
操作符作用-d测试文件是否为目录文件Directory-f测试文件是否为普通文件File-e测试目录或文件是否存在Exist-s判断文件是否为存字且为非空文件-N判断文件从上一次被读取之后是否被修改过-a测试目录或文件是否存在Exist建议使用-e-a可能不准确-r测试当前用户是否有权限读取Read-w测试当前用户是否有权限写入Write-x测试当前用户是否有权限执行eXcute-L测试是否为符号链接软链接文件-nt判断文件A是否比文件B新-ot判断文件A是否比文件B旧-ef判断两个文件是否为同一文件。可用于硬链接主要判断两个文件是否指向同一个inode。
案例一判断/root/是否为目录且输出它的状态码 
[rootmufeng ~]# test -d /root/  echo $?
0可以看到如果返回结果为0说明root是目录 
反之返回结果不为零就不是目录 
[rootmufeng ~]# test -d a.txt  ; echo $?
1这里使用的 和有什么区别? 
其实除了和; 还有 ||具体的区别如下 
: 逻辑与and 
当使用  分隔两个命令时如果第一个命令执行成功返回值为 0则会执行第二个命令。如果第一个命令执行失败返回值非 0则第二个命令不会执行。 
; 表示顺序执行 
当使用 ; 分隔两个命令时无论第一个命令执行成功与否都会执行第二个命令。 
|| 逻辑或or 
当使用 || 分隔两个命令时如果第一个命令执行失败返回值非 0则会执行第二个命令。如果第一个命令执行成功返回值为 0则第二个命令不会执行 
综上所述三个命令分隔符的区别如下 
只有前一个命令执行成功时才会执行后一个命令。;无论前一个命令执行成功与否都会执行后一个命令。||只有前一个命令执行失败时才会执行后一个命令。 
案例二 使用文件测试符来判断 
[rootmufeng ~]# [ -d /root/ ];echo $?
0
[rootmufeng ~]# [ -f /root/ ];echo $?
1
[rootmufeng ~]#  
这个时候没有使用test其实效果是一样只不过这里要用[]来框起来。 整数测试  
整数之间也可以比较整数之间的比较使用的操作符如下 
操作符含义-eq等于Equal-ne不等于Not Equal-gt大于Greater Than)-lt小于Lesser Than-le小于或等于Lesser or Equal-ge大于或等于Greater or Equal
使用的语法 
[  整数变量1  操作符  整数变量2  ] test 整数变量1  操作符  整数变量2案例一 测试3大于5 
[rootmufeng ~]# [ 3 -gt 5 ]; echo $?
1
# 使用变量的形式
[rootmufeng ~]# a3
[rootmufeng ~]# b5[rootmufeng ~]# [ $a -gt $b ];echo $?
1
[rootmufeng ~]#  
案例二 查询当前目录下的文件数是否小于100如果小于则提示 
[rootmufeng ~]# test ls|wc -l -lt 100  echo 文件数小于100文件数小于100字符串测试 字符串的测试不能够使用 le等等参数那些参数只用于数字那字符串的对比测试是如何来做呢  
操作符作用字符串内容相同!字符串内容不同! 号表示相反的意思-z字符串内容为空-n字符是否存在
字符比较的语法格式 [ 字符串1    字符串2  ]   //测试字符串1和字符串2的内容是否相同[ 字符串1 !  字符串2”  ]   //测试字符串1和字符串2的内容是否不同[ -z 字符串 ]    //测试字符串是否为空或者指定的变量是否为空值。测试字符串的长度是否为零[ -n 字符串 ]    //测试字符串是否存在即是否不为空。测试字符串的长度是否非零 
-n不为空这里我们可以用来判断对方输入的密码长度是否为空 
思考 -z 和-n的区别 
在 shell 脚本中-z 和 -n 是用于测试字符串长度的条件测试操作符。 
-z 字符串 返回真即退出状态为 0如果字符串的长度为零。 
-n 字符串 返回真即退出状态为 0如果字符串的长度非零。 
所以区别在于它们检查字符串长度的条件不同。 
如果你想测试一个字符串是否为空使用 -z 
如果你想测试一个字符串是否非空使用 -n。 
案例一 判断用户输入的密码是否为空 
[rootmufeng ~]# vim passwd.sh
[rootmufeng ~]# chmod x passwd.sh 
[rootmufeng ~]# ./passwd.sh 
请输入你的密码
当前未输入任何内容
[rootmufeng ~]# cat passwd.sh 
#!/bin/bash
read -p 请输入你的密码 passwd[ -z $passwd ]   echo 当前未输入任何内容 
案例二 判断两个字符串是否相等 
[rootmufeng ~]# cat passwd.sh 
#!/bin/bash
sthadbd
read -p 请输入你的密码 passwd[ $sth  $passwd ]   echo 当前密码符合要求
[rootmufeng ~]# ./passwd.sh 
请输入你的密码adbd
当前密码符合要求
[rootmufeng ~]#  
这里我们使用的read 获取键盘输入所获取到的一定是个字符串但有时候我们直接定义的一些参数或者截取的参数无法判断是字符串的时候需要加 才能进行字符串的判断。 逻辑运算符  
逻辑测试用于连接多个测试条件并返回整个表达式的值。 逻辑测试主要有逻辑与“逻辑或”逻辑否三种。 
常见的逻辑运算符 -a或 逻辑与“而且”的意思全真才为真。  -o或|| 逻辑或“或者”的意思一真即为真。  ! 逻辑否。  
在上面的案例中其实我们已经用到了比如  
比如我们可以这么用 [rootmufeng ~]# [ 1 -lt 2 ]  [ 1 -gt 4 ] ;echo $?
1 
这里的意思就是 1 小于2 并且1 大于4 最终输出结果为 1, 也就是不成立。 
但如果用 ||就不一样了 
[rootmufeng ~]# [ 1 -lt 2 ] || [ 1 -gt 4 ] ;echo $?
0 
这两个式子只要有一个成立即可。 
1.3 if条件判断语句的语法 
单分支语句 
第一种语法
if 条件表达式
then指令
fi第二种语法推荐使用
if 条件表达式;then指令
fi上文中的“条件表达式”位置部分可以使用test、[]、[[]]、(())等条件表达式 备注 
if与条件表达式之间要有空格[ ]与判断条件之间也必须有空格;前不能有空格以fi结尾表示if语句的结束 
双分支语句 
if 条件表达式then指令else指令
fi 
例如 
if [ 家里是否有吃的 ]then我们在家吃晚饭else我们去饭馆就餐fi多分支语句 
if 条件表达式1; then指令1
elif 条件表达式2; then指令2
elif 条件表达式3; then指令3
.......
else指令语句
fi 
二. if语句常见案例 
2.1 判断系统目录是否存在if单分支脚本 
#!/bin/bash
#2023-03-09 21:44:53
#By author mufeng
#Judge DIR or Files
#############################if [ ! -d /tmp/mufeng/ ];then   
#判断mufeng目录是否存在如果不存在就创建mufeng目录mkdir -p /tmp/mufeng/
fi 
运行结果 
[rootmufeng shell]# ll -d /tmp/mufeng/ 
ls: 无法访问/tmp/mufeng/: 没有那个文件或目录
[rootmufeng shell]# bash if_dir.sh 
[rootmufeng shell]# ll -d /tmp/mufeng/
drwxr-xr-x 2 root root 6 3月   9 21:53 /tmp/mufeng/2.2 比较两个整数大小if双分支脚本 
#!/bin/bash
#2023-03-09 21:59:10
#By author mufeng
#Judge Number Size
#############################read -p 请输入第一个整数:  NUM1
read -p 请输入第二个整数:  NUM2
if (($NUM1  $NUM2));thenecho The $NUM1 greate than $NUM2.
elseecho The $NUM1 less than $NUM2.
fi 
运行结果 
[rootmufeng shell]# bash if_number.sh 
请输入第一个整数: 56
请输入第二个整数: 12
The 56 greate than 12.
[rootmufeng shell]# 2.3 判断年龄段if多分支脚本 #!/bin/bash
#2023-03-09 22:38:07
#By author mufeng
#Judge age
#############################read -p 请输入你的年龄:  ageif (($age  8));thenprintf 儿童\n
elif (($age  8  $age 18));thenprintf 少年\n
elif (($age  18  $age  26));thenprintf 青年\n
elif (($age  26  $age  40));thenprintf 壮年\n
elif (($age  40  $age  60));thenprintf 中老年\n
elseprintf 老年\n
fi运行结果 
[rootmufeng shell]# bash if_age.sh 
请输入你的年龄: 3
儿童
[rootmufeng shell]# bash if_age.sh 
请输入你的年龄: 56
中老年
[rootmufeng shell]# bash if_age.sh 
请输入你的年龄: 12
少年
[rootmufeng shell]# bash if_age.sh 
请输入你的年龄: 99
老年
[rootmufeng shell]# bash if_age.sh 
请输入你的年龄: 38
壮年三. 拓展 
3.1 shell编程中各种括号的对比 
Shell编程中尤其是使用if语句时经常会使用()、(())、[]、[[]]、{}等括号我们来对比下 ( )用于多个命令组、命令替换、初始化数组多用于SHELL命令组 例如MO(mo1 mo2 mo3)其中括号左右不保留空格  (( ))整数扩展、运算符、重定义变量值算术运算比较,例如((i))、((i100)) 其中括号左右不保留空格  [ ] bash内部命令[ ]与test是等同的正则字符范围、引用数组元素编号 不支持±*/数学运算符逻辑测试使用-a、-o 通常用于字符串比较、整数比较以及数组索引其中括号左右要保留空格  [[ ]]bash程序语言的关键字不是一个命令[[ ]]结构比[ ]结构更加通用 不支持±*/数学运算符逻辑测试使用、||通常用于字符串比较、逻辑运算符等 其中括号左右要保留空格  {}主要用于命令集合或者范围例如mkdir -p /data/201{7,8}/其中括号左右不保留空格。  
3.2 shell脚本中各种引号的对比 
Shell编程中不仅会是使用变量还经常会使用$、\、单引号、双引号、反引号等符号。 如下为几种符号简单区别对比 $主要用于引用变量值例如定义变量MFmufeng,引用时需要用 $MF;  \反斜杠主要是用于对特定的字符实现转义保留原有意义例如echo “$MF”结果会打印$MF,而不会打印mufeng  单引号 单引号又称为强引不具有变量置换的功能所有的任意字符还原为字面意义实现屏蔽Shell元字符的功能  双引号又称为弱引具有变量置换的功能保留$使用变量前导符, (转义符), (反向引号)元字符的功能  反向引号反引号位于键盘Tab键上面一行的键用作命令替换相当于$(…)。  
举例 
[rootmufeng shell]# MFmufeng[rootmufeng shell]# echo $MF
mufeng[rootmufeng shell]# echo \$MF
$MF[rootmufeng shell]# echo hostname
hostname[rootmufeng shell]# echo $hostname
$hostname[rootmufeng shell]# echo hostname
mufeng[rootmufeng shell]# echo $(hostname)
mufeng总结 好啦这就是今天要分享给大家的全部内容了我们下期再见  博客主页mufeng.blog.csdn.net  本文由沐风晓月原创首发于CSDN博客  全力以赴持续学习不负如来不负卿