• 【Linux私房菜】第六期——Shell编程


    1.Shell 是什么?

    是一个命令解释器,它为用户提供一个向Linux内核发起请求以便于运行程序的界面系统级程序,用户可以用Shell来启动、挂起、停止甚至是编写一些程序。【以bash为例】

    请添加图片描述

    2.Shell 脚本是如何执行的?

    (1)脚本要以 #!/bin/bash开头

    请添加图片描述

    (2)可以通过sh + 脚本执行shell脚本

    请添加图片描述

    (3)也可以为要执行脚本的用户添加权限,输入脚本的路径即可

    请添加图片描述



    3.Shell 的变量是如何使用的呢?

    • Linux Shell中的变量分为** 系统变量和用户自定义变量 **两种【通过set指令可以查看系统变量】
    • 通过# 注释内容指令完成单行注释
    • 通过:<指令完成多行注释【两次的语句要另起一行】

    (1)Shell 变量的命名规则:

    变量名可以由字母、数字、下划线组成,但是不能以数字开头

    (2)使用规范:

    变量名采用大写字母,等号两侧不能留有空格

    (3)变量的几个基本操作

    通过变量名=变量值指令定义变量【静态变量要添加 readonly关键字】

    请添加图片描述

    echo 后的引号添不添加都可以,运行脚本输出结果如下

    请添加图片描述

    通过unset 变量名指令撤销变量【静态变量不能被撤销】

    请添加图片描述

    撤销后变量就无法使用了,运行脚本输出结果如下

    请添加图片描述

    通过反引号**`` ∗ ∗ 来将命令的返回值赋给变量,获取变量的值时也要在变量名前添加 ∗ ∗ **来将命令的返回值赋给变量,获取变量的值时也要在变量名前添加** 来将命令的返回值赋给变量,获取变量的值时也要在变量名前添加**符号


    4.如何避免在不同shell文件中重复设置相同的变量?

    • 可以通过设置环境变量【全局变量】所有shell脚本都可以使用
    • 设置环境变量的流程:

    (1)编辑/etc/profile文件,添加环境变量【使用了export关键字】

    请添加图片描述

    (2)通过source /etc/profile刷新配置信息

    (3)在终端利用echo直接输出TOMCAT_HOME

    请添加图片描述

    利用之前创建的var.sh文件调用并输出这个环境变量

    请添加图片描述
    请添加图片描述


    5.如何给Shell脚本传递参数呢?

    • 通过位置参数变量可以完成参数的传递
    • 在脚本中利用$n代表传入的第n个参数,执行脚本时在末尾添加多个参数【用空格隔开,传递的参数可以小于脚本中应用的参数个数】
    参数的语法基本含义
    $n$1-9代表第一个到第九个参数,十个以上要写成 ${n}的形式
    $*代表全部参数,把所有参数看成一个整体
    $@代表全部参数,把所有参数区分对待
    $#代表命令行中参数的个数

    请添加图片描述

    执行脚本并传入参数,运行结果如下:

    请添加图片描述


    6.Shell中有哪些预定义变量呢?【不常用】

    (1)$$返回当前进程号

    (2)$!返回后台运行的最后一个进程号

    (3)$?返回最后一次执行的命令的运行状态【0代表正常运行,其他代表运行出现了异常】


    7.Shell中如何进行算数运算?

    (1)有三种运算表达式

    exper 表达式一次只能进行一次运算【比如既有加法也有乘法,那么要用两次来计算】

    $((表达式))表达式为任意数学表达式【支持Shell的】

    $[表达式]这个属于上式的简化版本【推荐】

    (2)运算符

    符号含义
    +加法
    -减法
    *乘法(如果采用expr表达式要添加反斜杠\*
    /除法
    %取余

    请添加图片描述

    运算结果如下:

    请添加图片描述


    注意:【如果采用expr表达式】

    获取表达式结果要在两侧添加反引号**``**

    表达式之间以及与expr之间都有留有一个空格


    8.基本条件判断的语句格式?

    if [ 条件 ]
    then 
    满足条件的处理;
    fi
    
    • 1
    • 2
    • 3
    • 4

    (1)条件两侧留有一个空格

    (2)如果条件处不是一个条件表达式,那么就为true

    (3)字符串比较:=

    (4)两个整数比较:

    符号含义
    -lt小于
    -gt大于
    -eq等于
    -ne不等于
    -le小于等于
    -ge大于等于

    (5)文件权限比较:

    符号含义
    -r有读权限
    -w有写权限
    -x有执行权限

    (6)文件类型比较:

    符号含义
    -f文件存在并且是一个常规文件
    -e文件存在
    -d文件存在并且是一个目录
    -b文件存在并且是一个块设备文件
    -c文件存在并且是一个字符设备文
    -p文件存在并且是一个管道文件
    -s文件存在并且是一个套接字文件

    之所以没有-l是因为我测试发现

    请添加图片描述


    (7)案例分析

    请添加图片描述

    运行结果如下:

    请添加图片描述


    9.单分支与多分支条件判断语句【注意条件左右的空格】

    (1)单分支的代码格式:

    if [ 条件判断式 ]
    then
    代码
    fi
    
    • 1
    • 2
    • 3
    • 4

    (2)多分支的代码格式:

    if [ 条件判断式 ]
    then
    代码
    elif [ 条件判断式 ]
    then
    代码
    fi
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    (3)案例分析:输入考试成绩,大于60输出及格,否则输出不及格

    #!/bin/bash
    if [ $1 -ge 60]
    then
      echo "及格";
    elif [ $1 -lt 60]
    then 
      echo "不及格";
    fi;
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    请添加图片描述


    10.选择分支【case语句】

    (1)基本语法

    case $变量名 in
    "值1" )
    代码
    ;;
    "值2" )
    代码
    ;;
    * )
    default部分的代码
    ;;
    esac
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    (3)案例分析:参数为1输出1,参数为2输出2,其他情况输出0

    #!/bin/bash
    case $1 in
    "1" )
    echo 1;
    ;;
    "2" )
    echo 2;
    ;;
    * )
    echo 0;
    ;;
    esac;
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    请添加图片描述


    11.Shell的循环结构

    (1)for循环的基本语法

    # 语法一
    for 变量 in 值1 值2 ...
    do
    程序
    done
    # 语法二
    for(( 初始值;循环控制条件;变量变化))
    do
    程序
    done
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    (2)通过参数传入结合语法一我们可以看出$*$@的区别

    #!/bin/bash
    for i in "$*"
    do
    echo num = $i;
    done
    for j in "$@"
    do
    echo num = $j;
    done
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    输出结果如下:

    请添加图片描述

    有几个需要注意的点:【通过测试案例得知】

    • 如果不为$*添加引号,那么输出的结果也是三个,因为尽管$*是一个参数整体,但是$i每次从中只取一个子参数
    • 循环代码段执行几次,取决于 in 后面参数的个数

    (3)通过范围循环,我们完成1到100的和【注意:此处的判断符号使用的是数学符号】

    #!/bin/bash
    SUM=0;
    for((i=1;i<=100;i++))
    do
    SUM=$[SUM+$i];
    done
    echo sum = $SUM;
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    请添加图片描述

    (3)while循环语法格式【while与中括号、条件两侧 都有一个空格】

    while [ 条件 ]
    do
    代码
    done
    
    • 1
    • 2
    • 3
    • 4

    注意此处的条件采用了条件判断语句的符号,而不是直接使用数学符号

    利用while循环实现1-100加和

    #!/bin/bash
    SUM=0;
    i=0;
    while [ $i -le 100]
    do
    SUM=$[$SUM+$i]
    i=$[$i+1]
    done
    echo sum = $SUM
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    请添加图片描述


    12.用户如何动态的输入数据呢?

    (1)语法格式:read 选项 参数【参数要与前面的内容有一个空格】

    通过-p选项可以给出提示信息【自己预先设置的】

    通过-t选项可以设置等待输入时长(s)【超时则跳过当前输入】

    (2)案例分析:从键盘输入一个数NUM,不能超过5s

    #!/bin/bash
    read -t 5 -p "请输入一个数" NUM;
    echo "你输入的数为$NUM";
    
    • 1
    • 2
    • 3

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-p14nfnDe-1663549400089)(attachment:a24240ff493bd90f3141efd78c08f6c5)]


    13.Shell中的函数有哪些?

    • Shell中函数分为两类:系统函数自定义函数

    (1)系统函数【常用的有两个】

    通过base 路径指令获取文件名;通过dirname 路径指令获取文件的路径【不包括文件名】

    (2)自定义函数【基本语法如下】

    # 函数的定义
    function 函数名(参数列表){
        代码
    }
    # 函数的定义要写在调用前面
    # 函数的调用
    函数名 参数列表;
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    实现一个两个数加法函数:
    请添加图片描述
    运行结果如下:

    请添加图片描述


    14.综合案例分析:

    在这里插入图片描述
    数据库备份步骤:
    在这里插入图片描述
    编写Shell脚本【因为我没有安装Mysql所以此处为参考代码】
    在这里插入图片描述
    创建定时任务

    crontab -e
    30 2 `* * *` /user/sbin/mysql_db_backup.sh
    
    • 1
    • 2
  • 相关阅读:
    C_练习题 10
    Vue3的升级及优化总结
    Nginx 单个端口代理Minio
    西电数据挖掘实验3——复杂网络社团检测
    2021 OWASP TOP 10 漏洞指南
    八:ffmpeg命令提取像素格式和PCM数据
    实现响应式网页设计
    Java Thread synchronized同步锁简介说明
    【图神经网络论文整理】(五)—— Self-Attention Graph Pooling:SAGPool
    你想要的【微前端】都在这里了!
  • 原文地址:https://blog.csdn.net/qq_61323055/article/details/126926748