一、shell编程
1.shell是一个命令解释器,他为用户提供了一个向Linux内核发送请求以便于运行程序的界面系统程序,用户可以用shell启动、挂起、停止甚至是编写一些程序。
2.shell脚本的执行方式
(1)脚本格式要求
1)脚本比#!/bin/bash要求
2)脚本需要有可执行的权限
(2)编写一个shell脚本,要求输出helloworld
#!/bin/bash echo "hello world"(3)脚本的常用执行方式
1)方式1:输入脚本的绝对路径或相对路径
说明:首先要授予hello.sh脚本x权限,再执行脚本
2)方式2:sh+脚本
说明:不用赋予脚本x权限,直接执行
3.shell的变量
(1)shell变量的介绍
1)Linux shell这个变量分为系统变量和用户自定义变量
2)系统变量:$HOME、$PWD、$SHELL等等
3)显示当前shell中所有变量的命令:set
(2)shell变量的定义
基本语法
1)定义变量:变量名=值
2)撤销变量:unset 变量
3)声明静态变量:readonly 变量,注意:静态变量不能unset
快速入门:
#!/bin/bash #案例1:定义变量A A=100 echo "A=$A" #案例2:撤销变量A unset A echo "A=$A" #案例3:定义静态变量B readonly B=200 echo "B=$B" unset B echo "B=$B"
定义变量的规则
(1)变量名称可以由字母、数字、下划线组成,但是不能以数字开头,5A=200(❌️)
(2)等号两侧不能有空格
(3)变量名称一般大写
将命令的返回值赋给变量
(1)A=`date` 反引号,运行里面的命令,并把结果返回给A
(2)A=$(date)等价于反引号
二、设置环境变量
基本语法
1.exoprt 变量=变量值 (功能描述:将shell变量输出为环境变量/全局变量)
2.source 配置文件 (功能描述:将修改后的配置文件立即生效)
3.echo $变量名 (功能描述:查询环境变量的值)
快速入门
1.在/etc/profile 文件中定义TOMCAT_HOME环境变量
·
2.查看环境变量TOMCAT_HOME的值
3.在另一个shell程序中使用TOMCAT_HOME
注:在输出TOMCAT_HOME环境变量之前,需要让其生效
source /etc/profile三、位置参数变量
1.介绍
当我执行一个shell脚本时,如果希望获取到命令行的参数信息,就可以使用位置变量
2.基本语法
$n 功能描述:n为数字,$0代表命令本身,$1-9表示第一到第九参数,10以上的参数需要大括号包含,如${10}
$* 功能描述:这个变量代表命令行中所有的参数,$*吧所有的参数看做一个整体
$@ 功能描述:这个变量也代表命令行中的所有参数,不过$@把每个参数区分对待
S# 功能描述:这个变量代表命令行中所有参数的个数
3.案例:编写一个shell脚本,在脚本中获取到命令行各个参数信息
#!/bin/bash echo "参数1=$1" echo "参数2=$2" echo "参数3=$3" echo "参数4=$4" echo "参数个数=$#"四、运算符
1.基本介绍
学习如何在shell中进行各种运算操作
2.基本语法
(1)"$((运算式))"或者expr m+n(注:expr代表expression表达式)
(2)注意expr运算式之间要有空格,如果希望expr的结果赋给某个变量,使用反引号``
(3)expr \*乘 /除 %取余
3.使用案例
(1)计算(2+3)×4
(2)请求出命令行的两个参数[整数]的和 20 50
#!/bin/bash #方式一 RUM1=$(((2+3)*4)) echo "rum1=$RUM1" #方式二 RUM3=`exprt $1 + $2` echo "rum3=$RUM3"五、条件判断
1.判断语句
(1)基本语法:
[ condition ] (注意:condition前后要有空格)
#非空返回true,可使用$?验证(0为true,>1为false)
(2)应用实例
[ hspEdu ] 返回true
[ ] 返回false
[ condition ] && echo OK || echo notok 条件满足,执行后面的语句
(3)常用判断条件
1)=字符串比较
2)两个整数之间比较
-lt 小于 -le小于等于little equal -eq等于
-gt大于 -ge大于等于 -ne不等于
3)按照文件权限进行判断
-r有读的权限 -w有写的权限 -x有执行的权限
4)按照文件类型进行判断
-f文件存在并存在一个常规文件
-e文件存在
-d文件存在并是个目录
5)应用实例
案例1:“ok”是否等于“ok”
判断语句:=
案例2:23是否大于32
判断语句:-ge
案例3:/root/shcode/aaa.txt目录中的文件是否存在
#!/bin/bash #案例1:“ok”是否等于“ok” if [ "ok" = "ok" ] then echo "等于" fi #案例2:23是否大于22 if [ 23 -ge 32] then echo "大于" fi #案例3:/root/shcode/aaa.txt if [ -f /root/shcode/aaa.txt ] then echo "存在" fi2.if 判断
基本语法
if [ 条件判断式 ] then 代码 fi 或者多分支 if [ 条件判断式 ] then 代码 elif [ 条件判断式 ] then 代码 fi (注意事项:[ 条件判断式 ],中括号和条件判断之间必须有空格)应用实例:
请编写一个shell程序,如果输入的参数大于等于60,则输出“及格了”,反之输出“不及格”
#!/bin/bash if [ $1 -ge 60 ] then echo "及格了" elif [ $1 -lt 60 ] then echo "不及格" fi3.case语法
基本语法
case $变量名 in "值1") #如果变量的值等于值1,则执行程序1 ;; "值2") #如果变量的值等于值2,则执行程序2 ;; *) #如果变量的值不等于以上,则执行此程序 ;; esac应用实例testCase.sh
案例1:当命令行参数是1时,输出“周一”,是2时,就输出”周二”,其它情况输出“other”
#!/bin/bash case $1 in "1") echo "周一" ;; "2") echo "周二" ;; *) echo "other" ;; esac4.for循环
基本语法1:
for 变量 in 值1 值2 值3... do 程序 done应用实例1:打印命令行输入的参数(这里可以看出$*和$@的区别)
#!/bin/bash #案例1:打印命令行输入的参数(这里可以看出$*和$@的区别) for i in "S*" do echo "num1=$*" done #&*,把输入的参数当做一个整体,所以只会输出一行 echo"===========================================" for i in "S@" do echo "num1=$@" done #&@,把输入的参数分别对待,所以只会输出多行
基本语法2:
for ((初始值;循环控制变量;变量变化)) do 程序 done应用案例2:从1加到100的值输出结果
#!/bin/bash SUM=0 for ((i=1;i<=100:i++)) do echo SUM=$((SUM+i)) done echo "sum=$SUM"5.while循环
基本语句
while [ 条件判断式 ] do 程序 done注意:while和[]有空格,条件判断式和[]也有空格
应用实例:从命令行输入一个数n,统计1+...+n的值是多少
#!/bin/bash SUM=0 i=0 while [ "$i" -le "$1" ] do SUM=$((SUM+i)) i=$((i+1)) done echo "sum=$SUM"六、read读取控制台输入
1.基本语法
read(选项)(参数) 选项: -p:指定读取值的提示符 -t:指定读取值时等待的时间(秒),如果没有指定的时间内输入,就不再等待了 参数: 变量:指定读取值的变量名2.应用实例
#!/bin/bash #案例1:读取控制台输入一个NUM1值 read -p "请输入num1" NUM1 echo "num1=$NUM1" #案例2:读取控制台输入一个NUM2值,在10秒内输入。 read -t 10 -p "请输入num2" NUM2 echo "num2=$NUM2"七、函数
1.函数介绍
shell编程和其他编程语言一样,有系统函数,也可以自定义函数。系统函数种,介绍一下两个
2.系统函数
(1)basename基本语法
功能:返回完整路径最后/的部分,常用于获取文件名
basename [pathname] [suffix]
basename [string] [suffix]
功能描述:basename命令会删掉所有前缀包括最后一个‘/’字符,然后将字符串显示出来。pathname为路径,string为字符串
选项:
suffix为后缀,如果suffix被指定了,basename那么会将pathname或者string中的suffix去掉
(2)dirname基本语法
功能:返回路径最后/前面的部分。常用于返回路径部分
dirname 文件绝对路径
功能描述:从给定的包含绝对路径的文件名中去除文件名(非目录的部分),然后返回剩下的路径(目录的部分)
3.自定义函数
基本语法:
function 函数名(){ 命令代码 } #调用直接写 函数名()应用实例
#!/bin/bash #实例:计算输入两个参数的和(动态的获取),getSum function getSum(){ sum=$(($1+$2)) echo "sum=$sum" } read -p "输入数字1:" num1 read -p "输入数字2:" num2 getSum $num1 $num2八、自动化备份脚本
备份/var/log目录,并自动清理 7 天前的备份文件。
#!/bin/bash # ==================== 配置区 ==================== BACKUP_SOURCE="/var/log" # 要备份的源目录 BACKUP_BASE="/backup" # 备份存放的根目录 RETENTION_DAYS=7 # 保留最近多少天 DATE=$(date +%Y%m%d) # 日期格式:20260705 BACKUP_NAME="log_backup_${DATE}" # 备份文件名 BACKUP_PATH="${BACKUP_BASE}/${BACKUP_NAME}" # 完整备份路径 LOG_FILE="${BACKUP_BASE}/backup.log" # 日志文件 # ============================================== # ==================== 主程序 ==================== # 1. 创建备份存放目录(如果不存在) mkdir -p "${BACKUP_BASE}" # 2. 执行备份(使用 tar 打包并压缩) echo "========================================" >> "${LOG_FILE}" echo "[$(date '+%Y-%m-%d %H:%M:%S')] 开始备份 ${BACKUP_SOURCE}" >> "${LOG_FILE}" tar -czf "${BACKUP_PATH}.tar.gz" -C "${BACKUP_SOURCE}" . 2>/dev/null # 3. 检查备份是否成功 if [ $? -eq 0 ]; then echo "[$(date '+%Y-%m-%d %H:%M:%S')] ✅ 备份成功: ${BACKUP_PATH}.tar.gz" >> "${LOG_FILE}" else echo "[$(date '+%Y-%m-%d %H:%M:%S')] ❌ 备份失败,请检查错误信息" >> "${LOG_FILE}" exit 1 fi # 4. 删除 7 天前的备份文件 echo "[$(date '+%Y-%m-%d %H:%M:%S')] 开始清理 ${RETENTION_DAYS} 天前的备份..." >> "${LOG_FILE}" find "${BACKUP_BASE}" -name "log_backup_*.tar.gz" -mtime +${RETENTION_DAYS} -delete if [ $? -eq 0 ]; then echo "[$(date '+%Y-%m-%d %H:%M:%S')] ✅ 清理完成" >> "${LOG_FILE}" else echo "[$(date '+%Y-%m-%d %H:%M:%S')] ⚠️ 清理过程中出现错误" >> "${LOG_FILE}" fi echo "========================================" >> "${LOG_FILE}" exit 0公司放假三天,结果为了面试一下子休了6天,结果面试全部GG,也没有学习好,无奈……
希望接下来会有好结果吧。