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

本文介绍了Shell脚本编程的基础知识,包括Shell语言特点、文件结构、变量定义与引用、脚本调用方式等核心内容。


重点讲解了条件判断(if语句)和循环结构(for/while循环)的语法与应用场景,并提供了多个实用示例,如磁盘容量监控、文件备份、日志巡检等。


文章还涉及Shell脚本参数传递和常见面试问题,适合初学者快速掌握Shell脚本编程基础。


通过具体案例展示了Shell在Linux环境下的自动化运维能力。


Shell 笔记


Shell 简介

Shell 是一门编程语言。

编程语言示例:

Java、Python、C++、C#、Php、Shell ....

特点:

  • 基于 Linux 环境,可以原生运行的一个脚本语言

  • 开发出来的脚本文件,一般是以 .sh 结尾的可执行文件

文件后缀 文件类型
xxx.sh Shell 脚本
xxx.py Python 脚本
xxx.jar Jar 包

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

bash 复制代码
sh shell脚本名 入参1 入参2 入参3 ...

常见面试问答

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

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

相关推荐
吴声子夜歌2 天前
Shell编程实例——编写安全的shell脚本(二)
linux·运维·shell
吴声子夜歌4 天前
Shell编程实例——内务及管理任务(一)
linux·运维·shell
吴声子夜歌4 天前
Shell编程实例——高级脚本编程(一)
linux·运维·网络·shell
吴声子夜歌4 天前
Shell编程实例——bash的配置与自定义(二)
linux·运维·shell
吴声子夜歌5 天前
Shell编程实例——与解析相关的任务(二)
linux·运维·shell
吴声子夜歌5 天前
Shell编程实例——脚本编程的附加特性
linux·运维·shell
云计算练习生5 天前
什么是内核?操作系统内核到底管哪些事
linux·windows·操作系统·内核·shell
吴声子夜歌8 天前
Shell编程实例——bash入门
linux·运维·shell
Swizard8 天前
Linux 日志神器 journalctl 完全指南:彻底替代传统日志查看方式
shell
吴声子夜歌9 天前
Shell编程——数组
linux·运维·shell