Shell 脚本基础

Shell脚本

脚本以#!/bin/bash开头

执行方式

  • 直接使用文件名执行:文件需要执行权限

  • bash xxx.sh来执行, 本质上是bash解析器去执行, 文件作为一个输入, 因此可以不需要执行权限

变量

系统变量

自定义变量

定义变量

# 定义一个变量username, 注意不能有多余的空格
username=ROOT

image-20221115190919833

# bash中变量默认类型都是字符串
x=1+1
echo $x

image-20221115191154660

# 将变量提升为全局变量, 使得其他的shell程序可以使用
export <变量名>

特殊变量

  • $n:表示第 n 个参数, 其中 $0 表示文件名
  • $#:获取所有的输入参数的个数, 即 n 的值
  • $*:获取所有的输入参数, 将输入参数看作是一个整体(本质上:将空格看作是参数的一个字符)
  • $@:获取所有的输入参数, 把每个参数区分对待
  • $?:判断上一条命令是否正确执行,
    • 如果返回值为0, 则说明上一条命令执行成功
    • 返回值非0, 则说明上一条命令执行失败

运算符

  • expr <表达式>

    image-20221115192940200

  • $[<表达式>](推荐)

执行表达式 (3 + 2) * 4 的案例

image-20221115193228674

image-20221115193534053

条件判断

[ <条件判断> ](注意前后需要方括号的前后需要添加空格)

  • 字符串比较

    • -lt:小于
    • -le:小于等于
    • -gt:大于
    • -ge:大于等于
    • -eq:等于
    • -ne:不等于

    image-20221115205901218

  • 按照文件权限进行判断

    • -r:有读权限
    • -w:写权限
    • -x:执行权限
  • 按照文件类型进行判断

    • -e:文件存在
    • -f:文件存在, 且是一个普通文件
    • -d:文件存在, 且是一个目录文件

    image-20221115210442059

流程控制

if分支

if [ <条件判断表达式> ];then# if分支
elif# else分支
fi

case语句

case <变量引用> in<情况一>)# 分支一, 必须要加")";;<情况二>)# 分支二;;*)# 默认分支, 相当于default;;
esac

for循环

for(( <初始值>;循环控制条件;变量变化 ))
do# 程序主体
done

案例应用:计算1到100的累和

#!/bin/bashsum=0
for((i=1;i<=100;i++))
do# 不支持+=的方式, 其中$[]表示运算表达式sum=$[$sum + $i]
doneecho $sum

案例应用:打印所有的输入参数 (比较 $ 和 $@)*

#!/bin/bashfor i in "$*"
doecho $i
doneecho "==========================分隔符测试======================="for i in "$@"
doecho $i
done

image-20221115213545543

while循环

#!/bin/bashsum=0
i=0while [ $i -le 100 ]
dosum=$[$sum + $i]i=$[$i + 1]
done

read读取控制台输入

相当于读取一个输入变量

#!/bin/bashsecond=7
read -t $second -p "提示信息: 请在 $second 秒内输入 name 的值. " nameecho "您输入的 name 的值为: $name"

函数

系统函数

# 获取最后一个"/"后面的字符串
basename <文件路径># 获取最后一个"/"前面的字符串
dirname

案例应用: 获取当前文件夹所在的 basename 和 dirname

#!/bin/bash# 反引号表示其中的字符串当作bash命令进行执行
echo `pwd | xargs -I {} dirname {}`echo `pwd | xargs -I {} basename {}`

自定义函数

函数不可以写形参, 只能通过 $1, $2 这种形式来获取传入函数的值

#!/bin/bash# 注意: 函数不能写形参列表, 因此()内部必须是空, 甚至也可以不写()
function <函数名>()
{# 函数主体, 可以有返回值
}

案例应用:计算两个输入值的和

#!/bin/bash# 定义add()函数
function add()
{# 传入两个值, 将其相加result=$[$1 + $2]echo $result
}# 准备工作, 读取数据
read -p "请输入x的值: " x
read -p "请输入y的值: " y# 调用add()函数
add $x $y

shell工具 (重点)

cut

cut [选项参数] <文件路径>

  • -f:指定提取第几列

    • -f 3:表示获取第3列
    • -f 3-:表示获取第3列及其之后的数据的原始结果
    • -f -3:表示获取第3列及其之前的数据的原始结果
    • -f m-n:表示获取从第m列到第n列的数据的原始结果
  • -d:指定分隔符, 默认分隔符是制表符

注意cut并不能使用正则表达式的功能, 只能生硬的格式匹配

可以和grep搭配使用, 先进行一些数据的过滤, 然后在进行切分

sed (文件处理工具)

按行处理文件, 并将处理结果发送到控制台上, 源文件的内容默认并不会发生改变, 除非将输出结果重定向到源文件中

案例应用

  • 将“hello world”插入到指定文件的第 2 行下面

    # 2: 表示第2行
    # a: 表示插入模式
    sed "2a hello world" data.txt
    

    image-20221115224708586

    # 使用 -i 选项可以将输出流重定向到源文件中, 因此控制台不会产生输出, 并且源文件发生修改
    sed -i "2a hello world" data.txt
    

    image-20221115224806343

  • 删除指定文件中包含“hello”的行

    # /hello/: 表示"hello"字符串, 注意用两个斜杠包围起指定的字符串
    # d: 表示删除模式
    sed "/hello/d" data.txt
    

    image-20221115225519505

  • 替换指定文件中的“2”为 “7”

    # s: 表示替换模式
    # g: 全局替换, 默认情况下只替换第一次出现的
    sed "s/2/7/" data.txtsed "s/2/7/g" data.txt
    

    image-20221115225627374

awk

格式:awk [选项参数] '<命令1> <命令2> <...>' <文件名>

  • -F:指定输入文件的分隔符, 默认是空格

  • -v:可以定义一个变量并为其赋值, 之后在动作中可以使用该变量, 例如-v i=1定义了一个变量i, 其值为1

    内置变量, 可以直接在动作中使用

    • FILENAME:文件名
    • NR:已读的记录数(模式匹配时光标所处的行号)
    • NF:浏览记录的域的个数(即切割后, 列的个数)
  • <命令>命令由模式匹配+动作组成, 模式匹配中可以使用正则表达式

案例应用

  • 搜索 passwd 文件中以root开头的所有行, 并输出该行的第1列和第7列

    1. 原始文件

      image-20221117230936698

    2. 代码

      # 从原始文件可以看作, 使用":"进行分隔# 1. 使用 -F : 来指定使用":"进行分割
      # 2. /^root/ 表示模式匹配部分, 两个"/"之间的内容是正则表达式, ^root表示以root开头
      # 3. {} 中包含着要执行的动作, $1和$7分别表示分割后的第1列和第7列, 
      # 4. 特别原始的字符串拼接 $1","$7 = $1 + "," + $7
      # 5. 只有匹配了^root的行, 才会执行后面的{}中的动作
      awk -F : '/^root/{print $1","$7}' passwd
      
    3. 效果展示

      image-20221117231508062

  • 只显示passwd文件的第1列和第7列, 以逗号分隔, 并且在所有行的前面添加一个列名, 在所有行的末尾新添加一行数据

    多个需求的应用展示

    awk -F : 'BEGIN{print "user,filepath"} END{print "hello,world"} {print $1","$7}' passwd
    

    image-20221117232901864

  • 读取空行所在的全部行号

    image-20221117234009845

    # 正则表达式^$表示空行
    # NR表示当前读取到的光标的位置, 用来输出行号
    awk '/^$/{print NR}' data.txt
    

    image-20221117234059968

sort

排序不改变源文件, 除非重定向

  • -n:按数值大小进行排序
  • -r:逆序排序
  • -t:设置排序时所用的分隔符
  • -k:指定按哪一列进行排序

案例应用

  1. 数据文件

    image-20221117235129641

  2. :进行分隔, 按切分后的第3列进行逆序排序

    sort -t : -n -r -k 3 sort.data
    # 没有带输入参数的选项可以合并, 因此可以简写为
    sort -t : -nrk 3 sort.data
    

    image-20221117235358379

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

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

相关文章

实战 9 权限菜单管理

目录 1、权限菜单后端接口 2、查询权限菜单列表 2.1 设计效果图 2.2 menuList.vue 3、 新增权限菜单 3.1 新增权限菜单窗口代码 3.2 选择所属菜单代码 3.3 封装图标选择器 3.4 新增、编辑和删除权限菜单 1、权限菜单后端接口 package com.cizhu.service;import com.ci…

C# WPF上位机开发(子窗口通知父窗口更新进度)

【 声明&#xff1a;版权所有&#xff0c;欢迎转载&#xff0c;请勿用于商业用途。 联系信箱&#xff1a;feixiaoxing 163.com】 这两天在编写代码的时候&#xff0c;正好遇到一个棘手的问题&#xff0c;解决之后感觉挺有意义的&#xff0c;所以先用blog记录一下&#xff0c;后…

基于flask和echarts的新冠疫情实时监控系统源码+数据库,后端基于python的flask框架,前端主要是echarts

介绍 基于flask和echarts的新冠疫情实时监控系统 软件架构 后端基于python的flask框架&#xff0c;前端主要是echarts 安装教程 下载到本地&#xff0c;在python相应环境下运行app.py,flask项目部署请自行完成 使用说明 flaskProject文件夹中 app.py是flask项目主运行文…

Android Studio解决:Connect time out问题

目录 前言 一、错误信息 二、解决方法 三、更多资源 前言 当您尝试建立网络连接时&#xff0c;如果连接的建立时间超过了预设的时间限制&#xff0c;就会出现"Connect time out"的错误提示。这通常是由于网络连接问题、服务器故障或网络延迟等原因导致的。 一、…

ARM Cortex-A学习(1):GIC(通用中断控制器)详解

文章目录 1 Cortex-A核中断1.1 处理器模式1.2 IRQ模式 2 GIC的操作2.1 CPU Interface2.2 Distributor GIC(通用中断控制器, Generic Interrupt Controller)是一种用于处理中断的硬件组件&#xff0c;它的主要功能是协调和管理系统中的中断请求&#xff0c;确保它们被正确地传递…

VD6283TX环境光传感器(1)----获取光强和色温

VD6283TX环境光传感器.1--获取光强和色温 概述视频教学样品申请完整代码下载主要特点硬件准备技术规格系统框图生成STM32CUBEMX串口配置IIC配置X-CUBE-ALS演示结果光强测试表 概述 为了充分利用VD6283TX传感器的特性和功能&#xff0c;本章节重点介绍了如何捕获光强度和相关色…

QT foreach

原型&#xff1a;foreach(variable, container) container&#xff1a;容器&#xff0c;即被遍历的对象 variable&#xff1a;当前元素&#xff0c;即遍历container过程中&#xff0c;当前的那个元素 代码&#xff1a; QStringList container { "1", "2&quo…

JVM 类加载子系统

1. 前言 ​ 虚拟机就是一款用来执行虚拟计算机指令的计算机软件。它相当于一台虚拟计算机。大体上&#xff0c;虚拟机分为系统虚拟机和程序虚拟机。系统虚拟机就相当于一台物理电脑&#xff0c;里面可以安装操作系统&#xff1b;程序虚拟机是为了执行单个计算机程序而设计出来…

Linux文件编程

目录 1、Linux系统提供的文件编程API 1.1打开文件&#xff1a;open 1.2创建文件creat函数 1.3写入文件write函数 1.4读取文件read函数 1.5文件光标位置lseek函数 2、另外一组文件编程API 2.1文件打开函数fopen 2.2读文件函数fread 2.3写文件函数fwrite 2.4文件光标位…

vscode中使用GitHub Copilot Chat

文章目录 一、什么是Github Copilot Chat二、安装使用三、如何使用1. 聊天功能2. 内联功能 一、什么是Github Copilot Chat GitHub Copilot Chat 由 OpenAI 的 GPT-4 大型多模态模型提供支持&#xff0c;能带来更准确的代码建议、解释和指导。GitHub Copilot Chat 的内联功能可…

计算机毕业设计 基于SpringBoot的高校宣讲会管理系统的设计与实现 Java实战项目 附源码+文档+视频讲解

博主介绍&#xff1a;✌从事软件开发10年之余&#xff0c;专注于Java技术领域、Python人工智能及数据挖掘、小程序项目开发和Android项目开发等。CSDN、掘金、华为云、InfoQ、阿里云等平台优质作者✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精…

关于Python里xlwings库对Excel表格的操作(十九)

这篇小笔记主要记录如何【取消合并单元格】。 前面的小笔记已整理成目录&#xff0c;可点链接去目录寻找所需更方便。 【目录部分内容如下】【点击此处可进入目录】 &#xff08;1&#xff09;如何安装导入xlwings库&#xff1b; &#xff08;2&#xff09;如何在Wps下使用xlwi…

vscode括号颜色突然变成白色的了,怎么解决

更新版本后发现vscode的各种括号都变成了白色&#xff0c;由于分色括号已经使用习惯&#xff0c;突然变成白色非常不舒服&#xff0c;尝试多次后&#xff0c;为大家提供一下几种解决方式&#xff0c;希望能帮到同样受到此种困惑的你&#xff1a; 第一种&#xff1a; 首先打开…

WebGL开发建筑和设计教育应用

使用 WebGL 开发建筑和设计教育应用可以为学生提供沉浸式的三维体验&#xff0c;使他们能够在虚拟环境中探索建筑结构、材料和设计理念。以下是开发建筑和设计教育应用的一般步骤&#xff0c;希望对大家有所帮助。北京木奇移动技术有限公司&#xff0c;专业的软件外包开发公司&…

计算机视觉基础(13)——深度估计

前言 本节是计算机视觉的最后一节&#xff0c;我们将学习深度估计。从深度的概念和度量入手&#xff0c;依次学习单目深度估计和双目/多目深度估计&#xff0c;需要知道深度估计的经典方法&#xff0c;掌握深度估计的评价标准&#xff0c;注意结合对极几何进行分析和思考。 一、…

【LeetCode刷题笔记】动态规划(四)

背包问题 0-1 背包问题 有一个背包,它的容量为 C现在有 n 种不同的物品,他们的编号分别是 0...n-1。每一种物品只有一个。在这 n 种物品中,第 i 个物品的重量是 w[i],它的价值为 v[i]问题是:可以向这个背包中放哪些物品,使得在不超过背包容量的基础上,背包中物品的总价…

【SpringCloud笔记】(10)消息总线之Bus

Bus 前言 戳我了解Config 学习Config中我们遇到了一个问题&#xff1a; 当我们修改了GitHub上配置文件内容&#xff0c;微服务需要配置动态刷新并且需要手动向客户端发送post请求刷新微服务之后才能获取到GitHub修改过后的内容 假如有多个微服务客户端3355/3366/3377…等等…

Android 手机对于Arduino蓝牙控制解决方案

1、Android系统概述 ​ Android 系统是 Google 公司基于 Linux 内核开发的移动端操作系统,适用于智能手机智能手表平板电脑等设备&#xff0c;最新的版本为 7.1。Android系统具有免费开源的优势,任何企业与个人都可以查阅公开的 API 文档&#xff0c;并在自己开发的应用中通过调…

xlua源码分析(四) lua访问C#的值类型

xlua源码分析&#xff08;四&#xff09; lua访问C#的值类型 上一节我们主要探讨了C#是如何使用interface和delegate访问lua层的table和function的&#xff0c;本节我们跟着Examples 05_NoGc&#xff0c;来看看xlua是如何实现lua层无gc访问C#的值类型的。 首先例子中用到的lua…

List那些坑

很多文章都介绍过这些坑&#xff0c;本文做个记录&#xff0c;并提供解决方案。 1.Arrays.asList的坑 1.1现象 情况1&#xff1a;通过Arrays.asList方法生成的List数据不支持添加操作 使用Arrays.asList方法生成的List数据&#xff0c;不能对其进行删除或者添加操作。代码示例…