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/bash

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

echo $sum

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

#!/bin/bash

for i in "$*"
do
	echo $i
done

echo "==========================分隔符测试======================="

for i in "$@"
do
	echo $i
done

image-20221115213545543

while循环

#!/bin/bash

sum=0
i=0

while [ $i -le 100 ]
do
	sum=$[$sum + $i]
	i=$[$i + 1]
done

read读取控制台输入

相当于读取一个输入变量

#!/bin/bash

second=7
read -t $second -p "提示信息: 请在 $second 秒内输入 name 的值. " name

echo "您输入的 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.txt
    
    sed "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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

一体机定制_工控触控一体机安卓主板方案

工控一体机是一种集成化的硬件方案&#xff0c;采用了联发科MT8768八核芯片和12nm制程工艺。该芯片拥有2.0GHz的主频和IMG PowerVR GE8320图形处理GPU&#xff0c;具备强大的视频处理能力&#xff0c;并且兼容大部分的视频格式和解码能力。工控一体机搭载了Android 9.0操作系统…

学Java的第二天

一、常量 1.值不可以变化的量。 2. 分类&#xff1a; 字符串常量 用双引号括起来的多个字符&#xff0c;可以包含 0、1 或多个&#xff0c;例如 "a" 、 "abc" 、 " 中国 " 整数常量&#xff0c;例如&#xff1a; -10 、 0 、 88 小数常量&…

浅谈Java反射中的getFields()方法和getDeclaredFields ()方法

目录 1. 概念2. getFields()方法2. getDeclaredFields()方法4. 总结 1. 概念 反射是Java中一种强大的机制&#xff0c;允许在运行时获取、检查和操作类、方法、字段等信息&#xff0c;而不需要在编译时知道这些信息。 其中字段&#xff08;Field&#xff09;在Java中是类中用…

【精选】vulnhub CTF5 NanoCMS漏洞 (青铜门笔记)

&#x1f36c; 博主介绍&#x1f468;‍&#x1f393; 博主介绍&#xff1a;大家好&#xff0c;我是 hacker-routing &#xff0c;很高兴认识大家~ ✨主攻领域&#xff1a;【渗透领域】【应急响应】 【python】 【VulnHub靶场复现】【面试分析】 &#x1f389;点赞➕评论➕收藏…

微信小程序使用canvas制作海报并保存到本地相册(超级详细)

案例图 分析案例图都有哪些元素 1.渐变背景 2.圆形头像 3.文字 4.文字超出换行 5.图片居中 6.文字居中 7.单位适配 8.弹窗保存图片。因为一个个绘制图形太麻烦所以这里都采用了方法封装。 canvas api介绍 最后有全部代码&#xff0c;复制即用。 data数据 data() {return {myO…

并发程序设计--D1进程的创建和回收

进程和程序内容区别 进程包含的内容&#xff1a; BSS段&#xff1a;存放程序中未初始化的全局变量 数据段&#xff1a;已初始化的全局变量 代码段&#xff1a;程序执行代码 堆&#xff08;heap&#xff09;&#xff1a;malloc等函数分配内存 栈(stack)&#xff1a;局部变量…

升压斩波电路的simulink建模与仿真

目录 1.课题概述 2.系统仿真结果 3.核心程序与模型 4.系统原理简介 一、升压斩波电路概述 二、升压斩波电路的基本工作原理 5.完整工程文件 1.课题概述 升压斩波电路的simulink建模与仿真&#xff0c;通过双闭环结构实现电池&#xff0c;点击的控制。 2.系统仿真结果 …

复试情报准备

英语自我介绍&#xff0c;介绍完老师会根据你的回答用英语问你问题&#xff0c;比如介绍一下你的本科学校&#xff0c;或者家乡什么的。计网过一遍&#xff0c;会问两道题。接下来是重点&#xff0c;我当时是根据我成绩单&#xff0c;问了我本科学过的科目&#xff0c;比如pyth…

PPT中加入页码

PPT中加入页码 文章目录 简单版本样式更改 简单版本 PPT中插入页码&#xff0c;基础的就是在“插入”选项卡中单机“幻灯片编号”即可 样式更改 然而&#xff0c;就像我们做幻灯片不满足于白底黑字一样&#xff0c;页码也总不能是默认的样式。 比如&#xff0c;在页码下面…

Spring Cloud Gateway 网关整合 Knife4j 4.3 实现微服务接口文档聚合

&#x1f680; 作者主页&#xff1a; 有来技术 &#x1f525; 开源项目&#xff1a; youlai-mall &#x1f343; vue3-element-admin &#x1f343; youlai-boot &#x1f33a; 仓库主页&#xff1a; Gitee &#x1f4ab; Github &#x1f4ab; GitCode &#x1f496; 欢迎点赞…

QT小技巧 - 使用QMovie进行gif切帧

简介 使用QMovie 将 gif 进行切帧&#xff0c; magick 进行合并代码 QString gifPath "E:\\workspace\\qt\\gif2imgs\\203526qre64haq3ccoobqi.gif"; // 你的图片QMovie movie(gifPath); movie.setCacheMode(QMovie::CacheNone);qDebug() << movie.frameCou…

31. Ajax

简介 AJAX 是 Asynchronous JavaScript And XML 的简称。直译为&#xff0c;异步的JS和XML。AJAX的实际意义是&#xff0c;不发生页面跳转、异步载入内容并改写页面内容的技术。AJAX也可以简单的理解为通过JS向服务器发送请求。 AJAX这门技术很早就被发明&#xff0c;但是直到…

基于AR+地图导航的景区智慧导览设计

随着科技的飞速发展&#xff0c;智慧旅游已经成为现代旅游业的一个重要趋势。在这个背景下&#xff0c;景区智慧导览作为智慧旅游的核心组成部分&#xff0c;正逐渐受到越来越多游客的青睐。本文将深入探讨地图导航软件在景区智慧导览中的应用&#xff0c;并分析其为游客和景区…

C++中的存储类及其实例

文章目录 0. 语法1. 自动存储类自动存储类对象的属性自动存储类的例子 2. 外部存储类extern存储类对象的属性extern存储类的例子 3. 静态存储类静态存储类的属性静态存储类的例子 4. 寄存器存储类寄存器存储类对象的属性寄存器存储类例子 5. 可变&#xff08;mutable&#xff0…

iMazing2024免费版iOS移动设备管理软件

以自己的方式管理iPhone&#xff0c;让备受信赖的软件为您传输和保存音乐、消息、文件和数据。安全备份任何 iPhone、iPad 或 iPod touch。iMazing 功能强大、易于使用&#xff0c;称得上是 Mac 和 PC 上最好的 iOS 设备管理器。 正在为iTunes繁琐的操作发愁&#xff1f;设备数…

86% 的网络攻击是通过加密渠道进行

自 2022 年以来&#xff0c;HTTPS 威胁增长了 24%&#xff0c;凸显了针对加密通道的网络犯罪策略的复杂性。 制造业连续第二年成为最常受到攻击的行业&#xff0c;教育和政府组织的攻击同比增幅最高。此外&#xff0c;包括恶意 Web 内容和恶意软件负载在内的恶意软件继续主导其…

数字化转型是什么?有哪些应用?_光点科技

数字化转型是什么&#xff1f; 数字化转型是指企业或组织通过采用数字技术来改变其业务模式和运营方式&#xff0c;以适应新兴市场趋势、提高效率、增强客户体验和增加竞争优势的过程。它不仅涉及技术的变革&#xff0c;还包括企业文化、组织结构和业务流程的全面调整。数字化…

zookeeper基本使用

目录 环境搭建 单机版搭建 集群版搭建 基本语法使用 可视化客户端 数据结构 节点分类 1. 持久节点 2. 临时节点 3. 有序节点 4. 容器节点 5. TTL节点 节点状态 监听机制 watch监听 永久性watch 应用场景 1. 实现分布式锁 2. 乐观锁更新数据 应用场景总结 选…

docker安装MySQL8.0

1、从docker仓库中拉去mysql 8.0 docker pull mysql:8.0 2、查看是否拉取成功 docker images mysql:8.0 3、安装运行mysql8.0容器 docker run --name mysql8 -v /my/mysql/config:/etc/mysql/conf.d -v /my/mysql/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD123456 -p 3306…

《Spring Cloud学习笔记:Nacos配置管理 OpenFeign LoadBalancer Getway》

基于Feign的声明式远程调用&#xff08;代码更优雅&#xff09;&#xff0c;用它来去代替我们之前的RestTemplate方式的远程调用 1. Nacos配置管理 Nacos除了可以做注册中心&#xff0c;同样也可以做配置管理来使用。 利用Nacos实现统一配置管理以及配置的热更新&#xff1a;…