shell脚本编程

shell ---> 解析器:sh csh ksh bash

shell命令 ---> shell解析的命令

shell脚本 --> shell命令的有序集合

shell脚本编程:

        将shell命令结合按照一定逻辑集合到一起,写到一个 .sh 文件,去实现一个或多个功能,这个脚本文件不用编译可以直接执行

解释型:脚本、python

编译型:c、c++、java、汇编语言

写一个shell脚本文件的步骤:

创建一个脚本文件

        touch xxx.sh

编辑脚本内容

        vi xxx.sh 或者 code xxx.sh

执行脚本文件

        1)chmod 777 xxx.sh    ./xxx.sh

        2)bash 文件名

    shell变量

    shell中允许建立变量存储数据,但是不支持数据类型(如:整型、字符、浮点类型),所有赋值给变量的值都解释为一串字符。

    变量的定义格式:  变量名=值(等号两边都不能有空格)

    取变量的值:$变量名

    变量的分类
    系统环境变量

    系统配置好的,内置的变量

    env 或者 printenv:查看环境变量

    临时修改:export 变量名=值

    永久生效:只需要将这个命令放到家目录下的 .bashrc 中,当前用户有效

    自定义变量

    变量的格式

    变量名=

    变量名='值'

    变量名="值"

    =两侧不能有空格

    '' 内不能使用$展开变量的值

    修饰变量的关键字:

    unset:清空变量的值,不能清空readonly修饰的变量

    readonly:只读变量,值不能修改

    位置变量和命令行参数

    $0 ---> 执行脚本名

    $1 $2 $3 ... $9

    ${n} ---> n:大于等于10的数:如 ${10}

    $# ---> 获取所有外部参数的个数(不包含脚本名)

    $* 或者 $@ ---> 获取所有外部参数(不包含脚本名)

    预定义变量

    $? 获取的是上一条命令是否是正确的执行结果

    0:为真 非0:为假

    $$ 获取当前脚本的进程ID

    shell中的语句

    说明性语句

            以 # 号开始到该行结束,不被解释执行

            #!/bin/bash 告诉操作系统使用哪一种解析器执行的脚本文件

    功能性语句

            任意的shell命令、用户程序或其它shell程序

    结构性语句

            条件测试语句、多路分支语句、循环语句、循环控制语句

    功能性语句

    1.read(类似C语言中scanf)

             从终端获取值赋值给变量

            格式 read 变量1 变量2

            加提示语句:read -p "提示语句" 变量1 变量2

    补充:

    read -s 变量 ---> 输入的信息不回显

    read -t 秒数 变量 ---> 如果用户n秒不输入,就结束输入向后执行语句

    read -n 个数 变量名 ---> 如果输入n个字符,自动停止

    shell中的运算

    shell本身不擅长运算,需要借助于运算符和其他的指令

    2.1. expr

    使用方法:

    1. expr中使用变量,必须加$
    2. 如果想要接收expr的结果,必须使用命令置换符
    3. expr中运算符两侧必须有空格 、不支持自增和shell中的幂运算
    4. expr中使用某些运算符是,需要转义 |、>、<...
    5. expr指令的结果,直接回显到终端上,可以使用命令置换符接收

    2.2. let

    使用方法:

    1. let 变量名=表达式
    2. let运算时,运算符两侧不能有空格
    3. let中使用变量时,可以加$也可以不加
    4. 如果直接写成 let 表达式,表达式会运行,但是没有办法接收

    3.test

    test语句可以测试三种对象

    字符串 整数 文件属性

    3.1. 字符串测试

    s1 = s2 测试两个字符串是否相等

    s1 != s2 测试两个字符串是否不相等

    -z s1 测试字符串是否为空

    -n s1 测试字符串是否不为空

    3.2. 整数测试

    a -eq b 测试a和b相等 equal

    a -ne b 测试a和b不相等 not equal

    a -gt b 测试a大于b greater than

    a -ge b 测试a大于等于b greater equal than

    a -lt b 测试a小于b less than

    a -le b 测试a小于等于b less equal than

    3.3. 文件属性测试

    -d file 测试file是否为一个目录

    -f file 测试file是否是一个普通文件

    -e file 测试file是否存在

    结构性语句
    if .. then .. fi

    基本结构

    if 表达式
    then命令表
    fi
    

    分层结构

    if 表达式
    then命令表1
    else命令表2
    fi
    

    嵌套结构

    if 表达式
    thenif 表达式then
            命令表else
            命令表fi
    else
        命令表
    fi

    elif

    if 表达式1
    then命令表1
    elif 表达式2
    then命令表2
    ...
    else命令表n
    fi
    
    

    注意:

    如果表达式为真, 则执行命令表中的命令; 否则退出if语句,

    即执行fi后面的语句。

    if和fi是条件语句的语句括号, 必须成对使用;

    命令表中的命令可以是一条, 也可以是若干条。

    补充操作符:

    -o 或运算 例如 [ $a -lt 20 -o $b -gt 100 ] 返回 true

    -a 与运算 例如 [ $a -lt 20 -a $b -gt 100 ] 返回 false

    ! 非运算 例如 [ ! false ] 返回 true

    && 逻辑与 例如 [[ $a -lt 100 && $b -gt 100 ]] 返回 false

    || 逻辑或 例如 [[ $a -lt 100 || $b -gt 100 ]] 返回 true

    | 位或 例如 echo $[2|2]

    &位与 例如 echo $[2&1]

    case语句

    工作方式:

    取值后面必须为关键字 in ,每一个模式必须以右括号结束。

    取值可以为变量或者常量,取值检测匹配的每一个模式 一旦模式匹配,其间所有命令开始执行直至 ;;

    执行完匹配模式相应的命令不会再继续匹配其他的模式

    如果无一匹配模式,使用 * 号捕获该值

    for循环
    for语句的几种书写格式

    1.for i in 1 2 3 4 5 do .. done:变量i从单词表中取

    for i in 1 2 3 4 5
    do语句块
    done

    2.for i  do .. done:变量i从命令行中取值,可以省略in 单词表

    for in
    do语句块
    done

        3.for i in {1..10} do .. done

        for i in {1..10}
        do语句块
        done

        4.for (( i = 1; i <= 10; i++ )) do .. done

        for ((i=1;i<10; i++))
        do语句块
        done

        while循环
        while 命令或表达式
        do命令表
        done

        循环控制语句

        break n :结束n层循环

        continue n :跳过n层的本次循环

        本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
        如若转载,请注明出处:http://www.pswp.cn/web/93407.shtml
        繁体地址,请注明出处:http://hk.pswp.cn/web/93407.shtml
        英文地址,请注明出处:http://en.pswp.cn/web/93407.shtml

        如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

        相关文章

        【C++学习篇】:基础

        文章目录前言1. main() 函数2. 变量赋值3. cin和cout的一些细节4. 基本类型运算5. 内存占用6. 引用7. 常量前言 C 语法的学习整理&#xff0c;作为个人总结使用。 1. main() 函数 #include <iostream> //使用输入输出流库&#xff08;cin&#xff0c;cout&#xff09;…

        使用nginx反向代理kkfile

        这篇说一下我解决的思路和方式哈&#xff0c;不一定适用于大家&#xff0c;可以做个参考比如我们的系统服务是http://10.63.25.35:80&#xff0c;而我们的文件服务是在10.63.25.37:8012上&#xff0c;正常不使用代理的话&#xff0c;我们前端调用后端接口&#xff0c;后端调用k…

        【低成本扩容】动态扩容实战指南

        面对扩容操作时&#xff0c;下面这种操作是否也会迷惑你&#xff1f;下面来为大家解惑~size_t newcapacity 2*_capacity > (_size len)?2*_capacity:(_sizelen); //len为即将插入的字符串有效字符个数//_size为当前字符串有效字符个数//_capacity为当前容量大小//newcapa…

        Product Hunt 每日热榜 | 2025-08-14

        1. Autumn 标语&#xff1a;为AI初创公司简化的Stripe服务 介绍&#xff1a;Autumn帮助AI初创公司通过只需三个API调用来定价、计量和控制使用情况。基于Stripe搭建&#xff0c;它可以在一个地方管理订阅、使用情况和访问权限。无需复杂的webhooks或后端逻辑&#xff0c;非常…

        Scrapy + Django爬虫可视化项目实战(二) 详细版

        系列文章 Scrapy + Django爬虫可视化项目实战(一)_django scrapy-CSDN博客 实现技术 Scrapy Django Echarts 引言 可视化部分需要读者具备一定的Django基础!!! 上一个文章我们已经实现了爬取景点的数据,那么接下来就是根据爬取到的数据进行可视化 一、环境搭建 (一) 创…

        选择式与生成式超启发算法总结

        这里写目录标题Selection HHGeneration HHGPHH示例存在大量针对特定问题设计的启发式算法&#xff0c;近年来学术界提出了一个关键问题&#xff1a;如何选择最合适的启发式方法。这一问题推动了超启发式&#xff08;hyper-heuristic&#xff09;方法的研究发展。超启发式是一种…

        NetBIOS 设置

        在 Windows 系统中,WINS (Windows Internet Name Service) 和 NetBIOS 紧密相关,主要用于 NetBIOS 名称解析(将计算机名转换为 IP 地址)。WINS 是一个动态数据库,类似于 DNS,但专门用于 NetBIOS 名称解析,适用于早期 Windows 网络(如 Windows NT/2000/XP)。 1. 查看 N…

        vue2 + SimpleMindMap 制作思维导图

        vue2 SimpleMindMap 制作思维导图 该代码包含SimpleMindMap已知的所有功能&#xff0c;有需要的小伙伴可自行copy&#xff0c;框架使用el-ementui。其中有些图标是阿里巴巴矢量图的图片&#xff0c;可自行进行替换。保姆级教程 以下是vue文件&#xff1a; <template><…

        Discord x Pulsar: 使用 Pulsar、Flink 和 Iceberg 搭建流式机器学习平台

        本文整理自 Discord 机器学习工程师 David Christle 在 Pulsar Summit NA 上的演讲内容&#xff0c;一起来看 Discord 是如何基于 Pulsar 实现兼顾安全和个性化功能的实时流式机器学习平台的&#xff5e;1. 背景Discord 是一个实时⾳视频通信平台&#xff0c;⽀持⽂本/语⾳/视频…

        【数据结构入门】二叉树(2)

        目录 1.二叉树遍历顺序 1.1 前序&#xff08;先根&#xff09;遍历 1.2 中序&#xff08;中根&#xff09;遍历 1.3 后序&#xff08;后根&#xff09;遍历 1.4 层序遍历 1.5 深度优先遍历&广度优先遍历 2.二叉树的遍历 2.1 前根遍历&#xff08;递归&#xff09; …

        【电机参数】电压、电流、转速标幺化推算过程

        【电机参数】电压、电流、转速标幺化推算过程 文章目录[TOC](文章目录)前言一、标幺化目的——优化计算二、Q15与标幺化的关系三、标幺值计算1.电压标幺值2.电流标幺值3.转速标幺值四、参考资料总结前言 一、标幺化目的——优化计算 不同物理量的量纲和数值范围差异巨大&#…

        v-scale-scree: 根据屏幕尺寸缩放内容

        &#x1f90d; 前端开发工程师、技术日更博主、已过CET6 &#x1f368; 阿珊和她的猫_CSDN博客专家、23年度博客之星前端领域TOP1 &#x1f560; 牛客高级专题作者、打造专栏《前端面试必备》 、《2024面试高频手撕题》、《前端求职突破计划》 &#x1f35a; 蓝桥云课签约作者、…

        linux设备驱动之字符设备驱动

        一、cdev结构体‌成员/功能‌‌说明‌‌相关操作函数/宏‌‌kobj‌内嵌的kobject对象&#xff0c;用于Linux设备模型管理&#xff0c;实现引用计数和sysfs接口kobject_init()‌owner‌指向拥有该结构体的模块指针&#xff08;通常为THIS_MODULE&#xff09;&#xff0c;防止模块…

        ★CentOS:MySQL数据备份

        一、cp 命令备份特点&#xff1a;优点&#xff1a;备份恢复数据快&#xff1a;直接复制文件&#xff0c;无需进行数据转换和复杂的处理&#xff0c;因此备份恢复速度非常快缺点&#xff1a;需要停止数据库服务&#xff0c;灵活性差&#xff0c;占用空间大&#xff0c;可移植性差…

        Python代码规范与静态检查(ruff/black/mypy + pyproject.toml + Makefile)自动化工具链介绍

        文章目录**1. 核心工具的作用****(1) black&#xff1a;代码格式化工具****(2) ruff&#xff1a;代码质量检查工具****(3) mypy&#xff1a;静态类型检查工具****2. pyproject.toml&#xff1a;统一配置中心****示例配置**&#xff08;pyproject.toml&#xff09;&#xff1a;*…

        软件需求管理过程详解

        需求管理过程需求管理是软件工程和系统开发中的核心过程&#xff0c;它确保项目始终围绕正确、稳定且可追溯的需求进行。在复杂系统开发中&#xff0c;需求往往动态变化&#xff0c;需求管理通过系统化的方法控制变更、维护版本、建立追溯关系&#xff0c;从而降低项目风险、保…

        MySQL性能优化实战指南:从入门到精通的完整优化体系

        MySQL性能优化实战指南&#xff1a;从入门到精通的完整优化体系&#x1f680; 前言&#xff1a;在当今数据驱动的时代&#xff0c;MySQL作为世界上最流行的开源关系型数据库&#xff0c;其性能优化能力直接决定了应用系统的响应速度和用户体验。本文将从多个维度深入探讨MySQL优…

        KingbaseES主备读写分离集群安装教程

        首先我们先要找数据库集群安装软件和脚本。这里我事先安装一台单机。 [rootlocalhost zip]# mkdir -p /home/kingbase/software [rootlocalhost zip]# scp -r * /home/kingbase/software/ #安装软件和脚本在单机版本的/opt/Kingbase/ES/V9/ClientTools/guitools/DeployTools/z…

        electron程序适配loongArch64

        一、原始项目 1.原始程序适配arm&#xff0c;x86国产linux设备;新增需求适配loongArch64麒麟v10sp1。 2.原始devDependencies "devDependencies": {"electron": "^17.2.0","electron-builder": "^23.0.3",}二、可能遇到的问…

        窗口系统(windowing system)的架构思考

        我想做一个通用窗口系统&#xff0c;窗口、控件等&#xff0c;一切都抽象成树形结构的层叠矩形块&#xff0c;可支持半透明、模糊等混合选项&#xff0c;那么每个窗口是不是需要一块存储区&#xff1f;我之前的代码为了计算模糊&#xff0c;还不止一块&#xff0c;要三块。那么…