【Linux操作系统 | 第21篇-进阶篇】Shell编程(下篇)
文章目录
- 🥝if条件判断
- if判断🍋🟩
- 栗子🌰
- if elseif 语句🍋🟩
- 🥝case语句
- 栗子🌰
- 🥝for循环
- 基本语法1
- 栗子🌰:循环打印命令行输入的参数
- 基本语法2
- 栗子🌰:输出 1-100 的总和
- 🥝while循环
- 基本语法
- 栗子🌰:输出 1-100 的总和
- 🥝read读取控制台输入
- 栗子🌰
- 使用-p,读取控制台,输入一个NUM1值
- 使用-t和-p,读取控制台,输入一个NUM2值,并在5秒内输入
- 🥝Shell函数
- 应用实例:请以带和不带文件后缀名两种方式返回/home/shellCode/a.txt的文件名
- 自定义函数
- 语法1:传统语法
- 语法2:简化语法(推荐)
🥝if条件判断
if判断🍋🟩
基本语法:【注意:condition前后要有空格】
if [ condition ] then
满足if语句执行的代码
fi
常用的判断条件:
判断类别 | 判断符号和作用 |
---|---|
字符串比较 | = |
两个整数比较比较 | -lt 【小于】 -gt 【大于】 -le 【小于等于】 -ge 【大于等于】 -nt 【不等于】 |
按照文件权限判断 | -r (有读的权限) -w (有写的权限) -x (有可执行的权限) |
按照文件的类型判断 | -f (文件存在,并且是一个常规文件) -e (文件存在) -d (文件存在并且是一个目录) |
栗子🌰
- “hello"是否等于"hello”
- 23是否大于等于22
- /root/shellCode/vr.sh是否存在
注意:每个条件的前后都要有空格,否则会报错
脚本命令:
#!/bin/bash# 案例1
if [ "hello" = "hello" ]
then echo "两个字符串的值相等"
fi# 案例2
if [ 23 -ge 22 ]
thenecho "23大于22"
fi# 案例3
if [ -f /root/shellCode/vr.sh ]
then echo "文件存在"
fi
运行结果:
[root@hygge shellCode] ./ifDemo.sh
两个字符串的值相等
23大于22
文件存在
注意几个特殊写法:
- if [ abc ] 表示条件为 true
- if [ ] 表示条件为 false
if [ vvv ] thenecho "条件为真" fiif [ ] thenecho "条件不为flase" fi
运行结果:
[root@hygge shellCode] ./ifDemo.sh 条件为真
if elseif 语句🍋🟩
if [ $1 -ge 60 ] thenecho "及格" elif [ $1 -lt 60 ] thenecho "不及格" fi
[root@hygge shellCode] ./ifDemo.sh 80 及格[root@hygge shellCode] ./ifDemo.sh 55 不及格
🥝case语句
基本语法:
case “$变量名” in
值1)
命令1
命令2;; # 结束当前分支
值2|值3) # 多个模式用竖线分隔
命令3;;
*) # 默认分支(类似default)
默认命令;;
esac # case的倒写,表示结束栗子🌰
运行结果:[root@hygge shellCode] ./caseDemo.sh 1 Monday [root@hygge shellCode] ./caseDemo.sh 2 Tuesday [root@hygge shellCode] ./caseDemo.sh 35 other
🥝for循环
基本语法1
for 变量 in 值1 值2 值3…
do
满足循环条件需要执行的代码
done栗子🌰:循环打印命令行输入的参数
脚本命令:
#!/bin/bash for i in "$@" doecho "number is $i" done
执行结果:
[root@hygge shellCode] vim testFor.sh [root@hygge shellCode] chmod u+x testFor.sh [root@hygge shellCode] ./testFor.sh 100 200 300 number is 100 number is 200 number is 300
基本语法2
for ((初始值;循环控制条件;变量变化))
do
满足循环条件需要执行的代码
done栗子🌰:输出 1-100 的总和
脚本命令:
for (( i=1;i<=100;i++ )) doSUM=$[$SUM+$i] done echo "SUM是$SUM"
运行结果:
[root@hygge shellCode] ./testFor.sh SUM是5050
🥝while循环
基本语法
while [ 条件判断式 ]
do
代码
done栗子🌰:输出 1-100 的总和
脚本命令:
#!/bin/bash SUM=0 i=0 while [ $i -le $1 ] doSUM=$[$SUM+$i]i=$[$i+1] done echo "SUM=$SUM"
运行结果:
[root@hygge shellCode] vim testWhile.sh [root@hygge shellCode] chomd u+x testWhile.sh [root@hygge shellCode] ./testWhile.sh 100 SUM=5050
🥝read读取控制台输入
基本语法:
read 选项 参数
选项 功能 -p 指定读取值时的提示符 -t 指定读取值时等待的时间(秒),如果没有在指定的时间内输入,就不再等待了(放弃输入) 栗子🌰
使用-p,读取控制台,输入一个NUM1值
脚本命令:
#!/bin/bash read -p "请输入一个参数:" NUM1 echo "NUM1=$NUM1"
运行结果:
[root@hygge shellCode]# ./testRead.sh 请输入一个参数:100 NUM1=100
使用-t和-p,读取控制台,输入一个NUM2值,并在5秒内输入
脚本命令:
#!/bin/bash if read -t 5 -p "请输入一个参数:" NUM2 then echo "NUM2=$NUM2" elseecho "超时未输入" fi
运行结果:
[root@hygge shellCode] ./testRead.sh 请输入一个参数:100 NUM2=100
🥝Shell函数
shell编程和其他编程一样,有系统函数,也可以自定义函数。系统函数我们主要介绍两个。
- basename 获取文件名
作用:去掉文件完整路径的多级路径 (和后缀名),返回文件名
基本语法:basename 文件的完整路径 [文件后缀]
【不带文件后缀就保留扩展名,仅去掉路径前缀;带文件后缀名,就会去掉扩展名)】应用实例:请以带和不带文件后缀名两种方式返回/home/shellCode/a.txt的文件名
[root@hygge shellCode] basename /home/shellCode/a.txt # 不带文件后缀名 a.txt[root@hygge shellCode] basename /home/shellCode/a.txt .txt #带文件后缀名 a
- dirname 返回完整路径最前面部分
[root@hygge shellCode] dirname /home/shellCode/a.txt /home/shellCode
自定义函数
语法1:传统语法
function 函数名() {
命令集
return 返回值 # 可选,默认返回最后一个命令的退出状态(0或非0)
}语法2:简化语法(推荐)
函数名() {
命令集
}需求:计算两个输入参数的和
脚本命令:#!/bin/bash # 方式 1 function getSum () {SUM=$[$n1+$n2]echo "$SUM" } read -p "输入第一个参数:" n1 read -p "输入第二个参数:" n2 getSum $n1 $n2# 方式 2 getSum2 () {SUM=$[$n1+$n2]echo "$SUM" } read -p "输入第一个参数:" n1 read -p "输入第二个参数:" n2 getSum $n1 $n2
运行结果:
[root@hygge shellCode] ./testFunction.sh 输入第一个参数:10 输入第二个参数:20 30 输入第一个参数:10 输入第二个参数:20 30
如果我的内容对你有帮助,请 点赞 , 评论 , 收藏 。创作不易,大家的支持就是我坚持下去的动力!