shell (三)shell脚本

  • SHELL脚本

    • 编程语言的分类
      • 解释型语言:shell,Python,需要解析器

      • 编译型语言:C语言,C++,需要编译器

    • shell脚本

      • 操作系统的结构

        • shell(贝壳)

          • 应用层

            • app,代码

              • 应用层需要通过shell完成和内核的交互

          • 内核层

            • 设备管理

            • 文件管理

            • 网络管理

            • 进程管理

            • 内存管理

          • 硬件层

            • 外部设备

      • 第一个shell脚本

        • shell脚本的本质: 指令的集合

        • C语言文件 .c

          • shell文件 .sh

            • C++文件 .cpp

        • #!/bin/bash

          • #!用于指明该脚本默认使用shell解析器

          • 说明使用的是shell解析器

        • echo hello

          • 输出hello

            • echo 打印指令将hello输出

        • #

          • 在shell中表示注释

      • 执行脚本的三种方式

        • bash 文件名

          • 通过解析器,直接解析脚本

          • bash 1.sh

            • 执行过程:在后台打开一个终端

        • 直接运行脚本

          • 需要给脚本添加可执行权限

            • chmod 777 1.sh

            • 直接在终端输入1.sh

        • source 脚本名

          • 前台打开一个终端,执行脚本和返回脚本都在当前终端

    • 修改环境变量

      • 查看已有的特殊系统变量

        • env

      • 查看环境变量

        • echo $PATH

        • 环境变量的作用:当在终端直接运行指令时,去默认环境变量保存的路径中查找指令,如果没找到该指令不能执行

      • 修改环境变量

        • 只对当前终端有效

          • export PATH = ${PATH}:/home/ubunutu

            • export : 给系统变量赋值

            • PATH:被赋值的变量

            • =:赋值

            • ${PATH} : 拿到之前PATH的值

            • ::分隔

            • /home/ubuntu:添加的路径

          • 代码运行的作用:在当前终端给PATH添加了一个/home/ubuntu路径

        • 只对当前用户有效

          • 修改家目录下的~/.bashrc文件

            • 由于是当前用户下的家目录,所以不需要加sudo

          • vim ~/.bashrc

            • 然后将export表达式添加到文件的尾部

          • 修改文件后需要运行文件才能生效

            • source ~/.bashrc

            • 重启虚拟机

        • 对所有用户生效

          • 修改/etc/enviroment

            • sudo vim /etc/enviroment

              • 只有一行PATH的信息,想要添加的路径

          • 修改/etc/bash.bashrc文件

            • sudo vim /etc/bash.bashrc

              • 使用export表达式,添加路径

    • shell中的变量

      • shell中的变量没有数据类型的区别,shell是一种弱数据类型语言,都当字符串处理

      • 格式:

        • 变量名 = ‘变量的值’

          • 用于变量值内有空格时,无$获取变量的值

        • 变量名 = “变量的值”

          • 可以$变量的展开

        • 变量名 = 变量的值

          • = 号两侧不能有空格

      • 获取变量

        • $变量名

        • ${变量名}

          • 为了更好的区分变量名的范围

      • 修饰变量的关键字

        • readonly

          • 只读变量,值不能更改

        • unset

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

        • local

          • 定义局部变量(只能在函数中使用)

      • 外部传参/位置变量

        • 和C语言相同,脚本也可以在执行时进行外部传参,shell中通过位置变量获取参数

        • $0

          • 获取脚本名

        • $n

          • 获取第n个外部参数

            • n>10时需在n外加上大括号,否则只能读取一位

        • $#

          • 获取所有外部参数的个数

        • $*/$@

          • 获取所有的外部参数

      • 输出

        • echo

          • echo 输出内容(将内容回显到终端,并自动换行)

          • echo默认不解析转义字符

          • echo -n 输出内容

            • 取消echo输出时的换行

          • echo -e "hello\n"

            • 解析转义字符

      • 指令的格式:指令 参数 操作数

        • 有些指令也支持:指令 操作数 参数

          • echo 不支持

        • 指令的标准格式

      • 输入

        • 复习:C中使用scanf、gets、getchar需要变量的地址

        • shell中使用read指令完成输出

        • read

          • read 变量名

            • 直接加变量名即可,可以读入带空格的数据

          • read -p "提示信息" 变量名

            • 在终端给用户输出提示信息

          • read -s 变量名

            • 输入的信息不回显

          • read -t 秒数 变量名

            • 如果n秒用户不输入,就结束输入向后执行语句

          • read -n 个数 变量名

            • 如果输入n个字符,自动停止

      • 命令置换符

        • 作用:获取指令的执行结果

        • `命令` (反引号)

        • $(命令)

    • shell中的数组

      • shell中支持稀疏数组

      • 定义

        • 数组名=(初始值1 初始值2 初始值3 ····)

        • #shell中的数组,不需要写出数组长度

        • #shell中数组初始化时,直接使用()

        • #shell中的数组每个元素之间是空格不是逗号

        • #访问仍然通过下标访问,并且下标仍然从0开始

        • 数组名=([下标]=初始值 [下标]=初始值 ····)

          • 下标可以不连续

      • 访问数组中的元素

        • ${数组名[下标]}

          • 获取数组中指定下标的元素的值

        • 要在shell中需要使用变量的值,都要用$进行访问

      • 获取数组中元素的个数

        • ${#数组名[*/@]}

          • 获取数组中已经赋值的元素的个数

        • ${#数组名[下标]}

          • 获取数组中指定下标元素的长度(字符个数)

      • 稀疏数组

        • 下标不连续的数组

        • 稀疏数组中元素的个数,由不为空的数据的个数决定

        • 数组名=([下标]=初始值 [下标]=初始值 ····)

          • 下标可以不连续 初始值可以是任意字符/串

      • 使用已有的数组给新的数组赋值

        • arr=(1 2 3 4 5) arr1=(a b c d) #定义一个arr2数组使用已有的arr和arr1数组赋值 arr2=(${arr1[*]} ${arr[*]}) #拼接加空格 echo ${arr2[*]} echo ${#arr2[*]}

          • 拼接时两个数组中间没有加空格, 第一个数组中的对后一个元素和第二个数组中的第一个元素会被拼接到一起

          • 拼接时两个数组中间加空格,两个数组独立起来拼接

    • shell中的运算

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

      • (())

        • 常用于shell中的整数算术运算

        • (())几乎支持所有的C语言语法

        • ((表达式1,表达式2,表达式3,·······)) 每一个表达式都会执行,获取最右侧一个表达式的结果

        • 想要获取运算的结果,需要使用$(()),还可以((变量名=表达式))

        • 在(())中,使用变量的值,可以加$也可以不加$ (建议在(())直接使用变量的值,不加$)

        • 在(())中,运算符两侧可以有空格

      • $[]

        • 变量名=$[表达式1,表达式2,表达式3,·······]只获取最右侧表达式的结果

        • 使用变量时,可以加$也可以不加$

        • 运算符两侧可以加空格,也可以不加空格

        • $[]的结果,建议直接按照"变量名=$[]"格式接收,因为$[]本质上,会遗留一个运算结果在表达式的位置,如果不接受继续向后运行指令会报错

      • let

        • let 变量名=表达式

          • let和变量名中间一定要有空格

        • let中使用变量,可以加$也可以不加$

        • let运算时,运算符两侧一定不能有空格

        • 如果直接写成 let 表达式,表达式会运行,但是没有返回值

      • expr

        • 格式:expr 表达式

        • 是一个终端指令

          • 故而expr中使用变量,必须加$

        • 如果想要接收expr的结果,必须使用命令置换符

        • expr中运算符两侧必须有空格,不支持自增、自减和shell中的幂运算

        • expr中使用某些运算符时,需要转义|、>、<、.、······ (不需要记转义字符,简单的指令在运行前,去终端里运行一下指令,没结果就加上转义字符)

        • expr指令的结果,可以直接回显到终端上,故使用命令置换符接收回显值

        • expr操作数的值不能为空

          • 如果expr的操作数为空会报语法错误

        • expr进行整数算术运算

        • expr(字符串运算)

          • match 字符串 表达式

            • 返回表达式,在字符串中第一个位置起完全匹配成功的字符个数,如果能够匹配成功,返回值就是表达式中字符的个数

            • expr match "$str1" $str2

              • 由于str1中有空格,需用双引号引起来

            • str2不能在str1中的第一个位置开始完全匹配返回0

          • substr 字符串 偏移量 长度

            • 从字符串中偏移量的位置开始 截取指定长度的字串,偏移量从1开始

            • expr substr "$str1" 7 5

              • 截取出字符串的子串world

              • substr : 字符串的子串

          • index 字符串 字符

            • 返回字符在字符串中第一次被查找到时的下标,下标从1开始

            • expr index "$str1" el

              • 返回下标2

              • index:指标

            • 如果查找多个字符在字符串中的位置 返回最先出现的字符的位置

          • length 字符串

            • 返回字符串的长度

            • expr length "$str1"

    • if 分支结构

      • shell中的if语句格式

        • 单分支结构

          • if [ test语句 ] then 语句块 fi

        • 双分支结构

          • if [ test语句 ] then 语句块 else 不满足条件执行的语句 fi

        • 多分支结构

          • if [ test语句1 ] then 满足语句1执行的语句块 elif [ test语句2 ] ------> elif test 表达式 then 不满足语句1满足语句2执行的语句 else 两个都不满足语句块 fi

      • if对整数进行判断

        • ARG1 -eq ARG2: ARG1和ARG2相等

          • -eq : INTEGER1 is equal to INTEGER2

        • ARG1 -ge ARG2: ARG1>=ARG2

          • -ge : INTEGER1 is greater than or equal to INTEGER2

        • ARG1 -gt ARG2: ARG1>ARG2

          • -gt : INTEGER1 is greater than INTEGER2

        • ARG1 -le ARG2: ARG1<=ARG2

          • -le : INTEGER1 is less than or equal to INTEGER2

        • ARG1 -lt ARG2: ARG1<ARG2

          • -lt : INTEGER1 is less than INTEGER2

        • ARG1 -ne ARG2: ARG!=ARG2

          • -ne : INTEGER1 is not equal to INTEGER2

      • if对字符串进行判断

        • -n string

          • 字符串长度不为零

        • -z string

          • 字符串长度为零

        • str1 = str2

        • str1 != str2

      • if对文件进行判断

        • FILE1 -ef FILE2

          • FILE1 and FILE2 have the same device and inode numbers

        • FILE1 -nt FILE2

          • FILE1 is newer (modification date) than FILE2

        • FILE1 -ot FILE2

          • -ot :FILE1 is older than FILE2

        • -b FILE:文件存在且是一个块设备文件

        • -c FILE:文件存在且是一个字符设备文件

        • -d FILE:文件存在且是一个目录设备文件

        • -f FILE:文件存在且是一个普通文件

        • -h\-L FILE:文件存在且为软链接文件

          • lin

        • -S FILE:文件存在且是一个套接字文件

        • -e FILE:文件存在

          • equal

        • -s FILE:文件存在且大小不为0

        • -p FILE:文件存在且是一个管道文件

        • -w FILE:文件存在且有可写权限

        • -r FILE:文件存在且有可读权限

        • -x FILE:文件存在且有可执行权限

    • case in分支结构

      • 格式

        • case $变量名 in 常量1) 语句 ;; 常量2) 语句 ;; ······ 常量n) 语句 ;; *) 语句 esac

          • $变量名

            • 通过输入的变量,进入不同的 “常量)”分支

          • ;;

            • 和C中break的作用相同,shell中必须写;; (除非是最后一个分支)

          • *)

            • 起到通配符的作用,可以通配所有情况 shell中*)分支必须是最后一条分支

      • 1):如果变量的值为1

      • 1|2|3|4): 值为1或2或3或4都走该分支

      • [0-9]):0-9中的值都走该分支 不能写两位数,都是对单字符的判断

      • 1?):1开头两个字符一个确定一个不确定的情况

    • 循环结构

      • while循环结构

        • 格式

          • while [ test语句 ] do 语句块 done

            • while [ test语句 ] == while test 表达式

            • [] 中输入的语句需要用空格与中括号隔开

      • for循环结构

        • shell格式1(类似C语言)

          • 类似于C语言的格式 for ((表达式1;表达式2;表达式3)) do 循环体 done

            • 执行逻辑和C语言一致

        • shell格式2(自己的格式)

          • for 变量名 in 字符串列表 do 循环体 done

            • 执行逻辑

              • 循环变量i从in后面提供的字符串列表中,按顺序取值

              • 循环次数和字符串列表中字符串的个数有关

              • 直到i把字符串列表中每一个字符串的值都获取结束后,循环结束,(i为获取的值)

        • 使用连续列表的情况

          • seq 起始值 间隔值 终止值

            • 终端回显起始值到终止值之间的数

            • 故使用时需用指令置换符

          • {1..3}

            • 在bash编译器中遍历1-3中的每一个数 可以用在for中,单独使用不能回显在终端

            • {起始值..终止值}

              • 间隔值默认为1

              • 中间只能写两个点

      • select···in循环结构

        • 格式

          • select 变量名 in 选项列表 do 语句块 done

        • 执行逻辑

          • 会在终端打印选项列表 用户需要根据选项前面的序号做出选择 选择后变量会获取到相应的值 如果用户不做选择,会再次打印选项列表 如果用户选错,获取到空值

        • 常和case语句使用

          • 在select···in语句中,嵌套case···in语句, 可以根据用户的不同选择,使用case···in完成不同的处理

      • 辅助控制关键字

        • break n

          • 跳出n层循环

        • continu n

          • 退出第n层本次循环

            • 退出n层本次循环,跳出n层循环时,只需要看第n层循环是否有下一次即可

    • shell中的函数

      • 格式:(function)函数名() { 函数体 return 返回值 }

        • function 可加可不加

        • shell中的函数仍然满足先定义后调用

        • shell函数中是否还有返回值,根据实际的实现来决定

        • 返回值只能是(0~255)

      • 调用函数

        • ()内必须为空,不能写任何内容

        • 直接通过函数名调用函数

          • 函数名

          • fun

        • 函数调用后其内部的定义变量才能被调用

      • 如何获取函数的外部参数

        • 如果函数需要外部传参

          • 函数名 参数1 参数2 参数3 ·····

          • fun 12 34

            • 调用函数fun

        • 通过外部传参获取两个数,计算两数和

          • 先调用函数,并输入外部参数

        • 函数内部仍然通过$获取外部参数

          • n大于等于10时需用${10}

        • 函数内部使用$1 $2

          • 获取12和23 两个外部参数

        • 在函数外可以访问函数内的变量(全局变量),但需要函数被调用后访问

        • 函数内和脚本内的外部参数获取互不影响

          • 在函数内使用位置变量,获取的是函数的外部参数

          • 在脚本中使用位置变量,获取的是脚本的外部参数

        • 如果想要在函数中,使用脚本的外部参数,只能通过函数调用将该参数传给函数

      • 如何获取函数的输出

        • 函数有返回值

          • $?

            • 只能获取0-255范围内的值

            • 获取的是上一条指令的运行结果

        • 函数没有返回值

          • 但是函数有echo输出,可以使用命令置换符获取

          • ·· $()

      • local

        • 修饰局部变量

          • local sum

          • 全局变量sum被修饰为局部变量

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

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

相关文章

1、线性回归模型

1、主要解决问题类型 1.1 预测分析(Prediction) 线性回归可以用来预测一个变量(通常称为因变量或响应变量)的值,基于一个或多个输入变量(自变量或预测变量)。例如,根据房屋的面积、位置等因素预测房价。 1.2 异常检测(Outlier Detection) 线性回归可以帮助识别数…

鸿蒙开发系统基础能力:【@ohos.systemTime (设置系统时间)】

设置系统时间 本模块用来设置、获取当前系统时间&#xff0c;设置、获取当前系统日期和设置、获取当前系统时区。 说明&#xff1a; 本模块首批接口从API version 7开始支持。后续版本的新增接口&#xff0c;采用上角标单独标记接口的起始版本。 导入模块 import systemTime …

沙盒在数据防泄密领域意义

在信息化快速发展的今天&#xff0c;数据已成为企业最宝贵的资产之一。然而&#xff0c;数据泄密事件频发&#xff0c;给企业的安全和发展带来了巨大威胁。SDC沙盒防泄密系统&#xff0c;作为一种创新的数据防泄密解决方案&#xff0c;正逐渐在数据防泄密领域发挥着越来越重要的…

安装zabbix时报错Could not resolve host: mirrors.huaweicloud.com;Unknown error解决办法

目录 1、问题原因 2、解决办法 3、知识拓展 DNS的区别 DNS配置文件解析 域名解析过程 4、书籍推荐 当安装Zabbix server&#xff0c;Web前端&#xff0c;agent时出现&#xff1a; [rootsc-zabbix-server ~]# yum install zabbix-server-mysql zabbix-agent安装过程中会出…

Python3极简教程(一小时学完)上

开始 Python 之旅 本教程基于 Python for you and me 教程翻译制作&#xff0c;其中参考了 Python tutorial 和 _The Python Standard Library_&#xff0c;并对原教程的内容进行了改进与补充。 相关链接地址如下&#xff1a; _Python tutorial_&#xff1a;Python 入门指南…

数字孪生流域:定义、组成等

数字孪生流域&#xff1a;定义、组成等 1 数字孪生流域&#xff08;Digital Twin Basin/Watershed&#xff09;总则1.1 定义1.2 适用范围1.3 建设目标1.4 建设原则 2 数字孪生流域框架与组成2.1 数字孪生流域框架2.2 数字孪生流域组成2.2.1 数字孪生平台2.2.2 信息化基础设施 3…

JavaScript学习笔记(二)

12、数字 常规用法和java的用法相似&#xff0c;就不再做详细的记录, JavaScript 数字 以下只记录特殊用法&#xff1a; 12.1 数字字符串运算 在所有数字运算中&#xff0c;JavaScript 会尝试将字符串转换为数字&#xff1a; var x "100"; var y "10"…

第 5 章理解 ScrollView 并构建 Carousel UI

通过上一章的学习,我相信你现在应该明白如何使用堆栈构建复杂的 UI。当然,在你掌握 SwiftUI 之前,你还需要大量的练习。因此,在深入研究 ScrollView 以使视图可滚动之前,让我们先以一个挑战开始本章。你的任务是创建一个类似于图 1 所示的卡片视图。 …

swp添加池子addLiquidity失败

案发现场 首次添加交易对、一直失败、但是也没提示具体的原因。到这一步就没了、由下图可知、也没看到log、由此可见第一步就失败了。 解决方案 一、添加 工厂KywFactory 添加如下 bytes32 public constant INIT_CODE_PAIR_HASH keccak256(abi.encodePacked(type(KywPair…

注意!短视频的致命误区,云微客教你避开!

为什么你做短视频就是干不过同行&#xff1f;因为你总想着拍剧情、段子这些娱乐视频&#xff0c;还想着当网红做IP人设&#xff0c;但是这些内容跟你的盈利没有半毛钱关系&#xff0c;况且难度大、见效慢&#xff0c;还不是精准客户。 以上这些就代表你走进了短视频的误区&…

C++初学者指南-2.输入和输出---流输入和输出

C初学者指南-2.输入和输出—流输入和输出 文章目录 C初学者指南-2.输入和输出---流输入和输出1.定制输入/输出1.1 示例&#xff1a;点坐标输入/输出1.2 流操作符1.3&#xff08;一部分&#xff09;标准库流类型 2. 工具2.1 用getline读取行 2.2 用ignore进行跳转2.3 格式化操作…

【论文阅读】-- Temporal Summary Images:通过交互式注释生成和放置实现叙事可视化的方法

Temporal Summary Images: An Approach to Narrative Visualization via Interactive Annotation Generation and Placement 摘要1 引言2 背景及相关工作2.1 叙事可视化和讲故事2.2 显示面向时间的数据2.3 小倍数和漫画2.4 注释可视化 3 设计要求和工作流程3.1 工作流程3.2 TSI…

基线核查--渗透

基线检查 基线核查概念 it中定义&#xff1a; 基线为初始的标准&#xff0c;以后更改就要经过授权&#xff0c;形成下一基线。 软件配置管理的基线&#xff1a;1功能基线&#xff0c;分配基线&#xff0c;产品基线 安全配置基线--基线核查 安全基线可以说是木桶理论&…

【python】eval函数

1.eval函数的语法及用法 &#xff08;1&#xff09;语法&#xff1a;eval(expression) 参数说明&#xff1a; expression&#xff1a;必须为字符串表达式&#xff0c;可为算法&#xff0c;也可为input函数等。 说明&#xff1a;表达式必需是字符串&#xff0c;否则会报错&a…

Vue3-尚硅谷笔记

1. Vue3简介 2020年9月18日&#xff0c;Vue.js发布版3.0版本&#xff0c;代号&#xff1a;One Piece&#xff08;n 经历了&#xff1a;4800次提交、40个RFC、600次PR、300贡献者 官方发版地址&#xff1a;Release v3.0.0 One Piece vuejs/core 截止2023年10月&#xff0c;最…

Dubbo运行原理

目录 Dubbo通讯协议 Dubbo负载均衡策略 RPC和HTTP有什么区别&#xff1f; 让你设计一个RPC框架&#xff0c;如何考虑数据序列化问题&#xff1f; Dubbo 是一款高性能、轻量级的开源 RPC&#xff08;远程过程调用&#xff09;框架&#xff0c;主要用于构建分布式服务和微服务…

springcloud第4季 springcloud-alibaba之openfegin+sentinel整合案例

一 介绍说明 1.1 说明 1.1.1 消费者8081 1.1.2 openfegin接口 1.1.3 提供者9091 9091微服务满足&#xff1a; 1 openfegin 配置fallback逻辑&#xff0c;作为统一fallback服务降级处理。 2.sentinel访问触发了自定义的限流配置&#xff0c;在注解sentinelResource里面配置…

基于SpringBoot的学生综合测评系统

你好呀&#xff0c;我是计算机学姐码农小野&#xff01;如果有相关需求&#xff0c;可以私信联系我。 开发语言&#xff1a;Java 数据库&#xff1a;MySQL 技术&#xff1a;SpringBoot框架 工具&#xff1a;MyEclipse、Tomcat 系统展示 首页 系统首页&#xff0c;提供综合…

After Effects 2024 mac/win版:创意视效,梦想起航

After Effects 2024是一款引领视效革命的专业软件&#xff0c;汇聚了创意与技术的精华。作为Adobe推出的全新版本&#xff0c;它以其强大的视频处理和动画创作能力&#xff0c;成为从事设计和视频特技的机构&#xff0c;如电视台、动画制作公司、个人后期制作工作室以及多媒体工…

求职产品运营的个人简历案例(精选篇)

在求职产品运营的道路上&#xff0c;一份出色的个人简历是迈向成功的第一步&#xff0c;但是简历怎么写才最好呢&#xff1f;下面是小编整理的求职产品运营的个人简历案例&#xff0c;同时&#xff0c;幻主简历网还提供精美简历模板下载和简历在线制作工具&#xff0c;欢迎大家…