(课堂笔记)Shell 基础入门:语言特点、文件结构、变量定义与引用、循环、脚本调用、入参等
本文介绍了Shell脚本编程的基础知识包括Shell语言特点、文件结构、变量定义与引用、脚本调用方式等核心内容。重点讲解了条件判断if语句和循环结构for/while循环的语法与应用场景并提供了多个实用示例如磁盘容量监控、文件备份、日志巡检等。文章还涉及Shell脚本参数传递和常见面试问题适合初学者快速掌握Shell脚本编程基础。通过具体案例展示了Shell在Linux环境下的自动化运维能力。Shell 笔记Shell 简介Shell 是一门编程语言。编程语言示例Java、Python、C、C#、Php、Shell ....特点基于 Linux 环境可以原生运行的一个脚本语言开发出来的脚本文件一般是以.sh结尾的可执行文件文件后缀文件类型xxx.shShell 脚本xxx.pyPython 脚本xxx.jarJar 包Shell 脚本文件结构bash#!/bin/bash # 或者 #!/bin/sh —— 头文件用于定义编译器 # 逻辑体1. 变量a. 定义变量基本格式变量名变量值左右两边不允许出现空格bashA10 # 定义变量A的值是10 Bhello world使用Linux命令赋值变量名$(Linux命令)bashC$(cat emp | wc -l)b. 引用变量格式$变量名bashecho $A echo $B echo $C echo $A$B # 当变量需要跟其他内容拼接字符串时需要双引号2. 调用 Shell 脚本a. 用 sh 调用bashsh task.sh sh /home/hadoop/2608/test/task.shb. 用 ./shell脚本 调用前置条件必须在脚本的父目录调用该脚本的用户必须要有执行权限示例脚本示例1打印当前服务器磁盘剩余容量bash#!/bin/bash free$(df -h | awk -F {print $4} | sed -n 6p) echo 当前磁盘剩余$free示例2打印变量A 20 的返回值bash#!/bin/bash D$(($A 20)) echo 变量A20的结果是$D练习1开发 Shell 脚本统计 Linux 的两块内存的总剩余容量。3. 场景判断if语句语法结构bashif 判断条件 then 要做的事情 elif 判断条件 then 要做的事情 else 要做的事情 fia. 判断条件注意事项[ 比较值1 比较符号 比较值2 ]—— 空格不能少比较符比较符含义或-eq等于-gt大于greater than-lt小于less than-ge大于等于greater equal-le小于等于less equal-ne不等于not equal示例统计文件个数bash# 开发shell脚本统计 /home/hadoop/2608 下面的文件个数 # 如果大于10个则打印文件很多 # 如果大于5个则打印文件正常 # 否则打印文件过少 file_num$(find /home/hadoop/2608 -type f | wc -l) if [ $file_num -gt 10 ] then echo 文件很多 elif [ $file_num -gt 5 ] then echo 文件正常 else echo 文件过少 fi4. 循环1. for循环语法bashfor((i1;i100;i)) { 循环要做的事情 # $i }示例11~100求和bashsum0 for((i1;i100;i)) { sum$[$sum $i] } echo $sum示例2删除目录下所有文件bashtotal_num$(find /home/hadoop/2608 -type f | wc -l) for((i1;i$total_num;i)) { file_name$(find /home/hadoop/2608 -type f | grep -v task | head -$i | tail -1) rm -rf $file_name }示例3打印1~100所有偶数bashfor((i1;i100;i)) { x$[$i % 2] if [ $x -eq 0 ] then echo $i fi }练习2打印1~200以内的所有奇数求和bashtot0 for((i1;i200;i)) { res$[$i % 2] if [ $res 1 ] then tot$(($tot $i)) fi } echo 奇数求和为$tot2. while循环内容重定向语法bash命令A | while read line; do 循环要做的事情 # $line 指向每一行内容 done说明while read line的功能是逐行遍历命令A的标准输出每一行的内容都会逐次赋值给变量$line示例1删除所有空文件bashfind /home/hadoop/202608 -type f | while read line; do flag$(du $line | awk -F {print $1}) if [ $flag -eq 0 ] then rm -rf $line fi done示例2查找文件内容包含k的文件bashfind /home/hadoop -type f | while read line; do flag$(grep k $line | wc -l) if [ $flag -gt 0 ] then echo $line fi done示例3在/tmp目录下找所有文件内容包含a的文件思路先用find -type f找到所有/tmp目录下的文件通过while read line循环遍历通过grep a $line判断是否存在内容a练习3将/home/hadoop/2222目录下所有的文件备份如xxx→xxx_bakbashfind /home/hadoop/2222 -type f | while read line; do cp $line $line_bak done综合示例示例1生成100道随机小学加减法运算题bash# $RANDOM : 返回一个随机的整数 [0,3万多] # $RANDOM % 99 1 : 返回随机的 1~99 # read -t 10 -p 请输入你的年龄: age read -t 10 -p 请确认,是否需要带出答案(y/n) flag for((i1;i100;i)) { num1$[$RANDOM % 99 1] num2$[$RANDOM % 99 1] if [ $num1 -le $num2 ] then tmp$num2 num2$num1 num1$tmp fi x$[$RANDOM % 2] if [ $x -eq 0 ] then if [ $flag y ] then echo $num1 $num2 $[$num1 $num2] else echo $num1 $num2 fi else if [ $flag y ] then echo $num1 - $num2 $[$num1 - $num2] else echo $num1 - $num2 fi fi }示例2监控磁盘剩余容量bashfor((i1;i10;i--)) { desk_free$(df -h | awk -F {print $4} | sed -n 6p) if [ $desk_free -lt 20000 ] then echo 磁盘容量不足 # 发送给指定邮箱 elif [ $desk_free -lt 5000 ] then reboot fi sleep 2 # 休眠 }示例3自动化备份bash# 流程将备份目录压缩成包 → 把包丢到备份目录 → 删除历史备份包 date$(date %Y%m%d) tar -zcvf $date.tar.gz /home/hadoop/2608 mkdir -p /home/hadoop/backup mv $date.tar.gz /home/hadoop/backup find /home/hadoop/backup -type f -mtime 7 | xargs rm -rf示例4自动化巡检服务日志bashfind /opt/module/hadoop-3.3.0/logs -name *.log | while read line; do err_num$(grep error $line | wc -l) if [ $err_num -eq 0 ] then echo $line是没有报错的 else echo $line有报错,错误信息,请在 /home/hadoop/1111/err.txt 查阅 grep error $line /home/hadoop/1111/err.txt fi doneShell 脚本的入参参数变量变量含义$0被调用的脚本文件名$1第一个入参值$2第二个入参值$3第三个入参值$*所有的入参集合$#入参的个数$?判断上一个命令返回的布尔值真则返回0否则返回1调用方式bashsh shell脚本名 入参1 入参2 入参3 ...常见面试问答Q开发过什么功能性的Shell脚本A开发过一些自动化备份、打包、巡检等相关的脚本也封装过一些数据库的脚本执行。