news 2026/5/15 22:32:06

(课堂笔记)Shell 基础入门:语言特点、文件结构、变量定义与引用、循环、脚本调用、入参等

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
(课堂笔记)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. 定义变量

基本格式:变量名=变量值(左右两边不允许出现空格)

bash

A=10 # 定义变量A的值是10 B="hello world"

使用Linux命令赋值:变量名=$(Linux命令)

bash

C=$(cat emp | wc -l)

b. 引用变量

格式:$变量名

bash

echo $A echo $B echo $C echo $A"$B" # 当变量需要跟其他内容拼接字符串时,需要双引号

2. 调用 Shell 脚本

a. 用 sh 调用

bash

sh task.sh sh /home/hadoop/2608/test/task.sh

b. 用 ./shell脚本 调用

前置条件:

  1. 必须在脚本的父目录

  2. 调用该脚本的用户必须要有执行权限


示例脚本

示例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 "变量A+20的结果是:"$D

练习1

开发 Shell 脚本,统计 Linux 的两块内存的总剩余容量。


3. 场景判断(if语句)

语法结构

bash

if 判断条件 then 要做的事情 elif 判断条件 then 要做的事情 else 要做的事情 fi

a. 判断条件注意事项

  1. [ 比较值1 比较符号 比较值2 ]—— 空格不能少

  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 "文件过少" fi

4. 循环

1. for循环

语法:

bash

for((i=1;i<=100;i++)) { 循环要做的事情 # $i }
示例1:1~100求和

bash

sum=0 for((i=1;i<=100;i++)) { sum=$[$sum + $i] } echo $sum
示例2:删除目录下所有文件

bash

total_num=$(find /home/hadoop/2608 -type f | wc -l) for((i=1;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所有偶数

bash

for((i=1;i<=100;i++)) { x=$[$i % 2] if [ $x -eq 0 ] then echo $i fi }

练习2

打印1~200以内的所有奇数求和

bash

tot=0 for((i=1;i<=200;i++)) { res=$[$i % 2] if [ $res == 1 ] then tot=$(($tot + $i)) fi } echo "奇数求和为:"$tot

2. while循环(内容重定向)

语法:

bash

命令A | while read line; do 循环要做的事情 # $line 指向每一行内容 done

说明:while read line的功能是逐行遍历命令A的标准输出,每一行的内容都会逐次赋值给变量$line

示例1:删除所有空文件

bash

find /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"的文件

bash

find /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"的文件

思路:

  1. 先用find -type f找到所有/tmp目录下的文件

  2. 通过while read line循环遍历

  3. 通过grep "a" $line判断是否存在内容"a"


练习3

/home/hadoop/2222目录下所有的文件备份(如:xxxxxx_bak

bash

find /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((i=1;i<=100;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:监控磁盘剩余容量

bash

for((i=1;i<=10;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:自动化巡检服务日志

bash

find /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 done

Shell 脚本的入参

参数变量

变量含义
$0被调用的脚本文件名
$1第一个入参值
$2第二个入参值
$3第三个入参值
$*所有的入参集合
$#入参的个数
$?判断上一个命令返回的布尔值(真则返回0,否则返回1)

调用方式

bash

sh shell脚本名 入参1 入参2 入参3 ...

常见面试问答

Q:开发过什么功能性的Shell脚本?

A:开发过一些自动化备份、打包、巡检等相关的脚本,也封装过一些数据库的脚本执行。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/5/15 22:31:06

终极营销自动化工作流设计:工程师如何构建高效营销流程

终极营销自动化工作流设计&#xff1a;工程师如何构建高效营销流程 【免费下载链接】Marketing-for-Engineers A curated collection of marketing articles & tools to grow your product. 项目地址: https://gitcode.com/gh_mirrors/ma/Marketing-for-Engineers …

作者头像 李华
网站建设 2026/5/15 22:29:05

FPGA与以太网:从MII接口到UDP通信的实战解析

1. 以太网通信与FPGA开发入门 第一次接触FPGA以太网开发时&#xff0c;我被各种专业术语搞得晕头转向。MII、PHY、MAC、UDP这些名词像天书一样&#xff0c;直到真正动手做了一个数据采集项目才豁然开朗。以太网通信看似复杂&#xff0c;其实拆解开来就是硬件接口协议栈数据处理…

作者头像 李华
网站建设 2026/5/15 22:27:08

认识Python网络套接字编程之流式套接字(一)

流式套接字当你需要使用 TCP 协议进行通信时&#xff0c;需要创建流式套接字。这是套接字编程中最常用的一种。光谈这些概念显得很抽象&#xff0c;还是举送外卖的这个例子&#xff0c;假设你点了一份烤鸭&#xff0c;外卖骑手需要先去店铺取餐&#xff0c;然后送到你的家门口&…

作者头像 李华
网站建设 2026/5/15 22:26:08

群联PS3111主控mSATA固态硬盘开卡实战:从识别到量产的全流程解析

1. 故障识别与工具准备 遇到一块无法格式化的mSATA固态硬盘时&#xff0c;首先要确认故障类型。我最近就碰到一块群联PS3111主控的硬盘&#xff0c;插上电脑能识别但无法初始化&#xff0c;磁盘管理显示"未分配空间"。这种情况多半是固件损坏或闪存映射表出错&#x…

作者头像 李华