【Linux】Shell

Shell

文章目录

  • Shell
  • 1. 简介
  • 2. Shell 脚本入门
  • 3. 变量
  • 4. 运算式
  • 5. 条件判断
  • 6. 流程控制
    • 6.1 if 判断
    • 6.2 case 语句
    • 6.3 for 循环
    • 6.4 while 循环
  • 7. read 读取控制台输入
  • 8. 函数
    • 8.1 系统函数
    • 8.2 自定义函数
  • 9. 正则表达式入门
  • 10. 文本处理工具
    • 10.1 cut
    • 10.2 awk
  • 11. 归档文件案例

1. 简介

Shell是一个命令行解释器,它接收应用程序/用户命令,然后调用操作系统内核。Shell还是一个功能相当强大的变成语言。

查看 Linux 提供的 Shell 解释器:cat /etc/shells ,其中 sh 是软链接,指向 bashCentOS 默认的解析器是 bash

2. Shell 脚本入门

脚本文件格式:#!/bin/bash 开头,表示指定解析器

脚本的执行方式:

  1. bash 脚本路径 sh 脚本路径 :这种方式不用赋予 x 权限
  2. 脚本路径 :当前目录下必须用 ./脚本名 的方式执行,要求必须有 x 权限
  3. .source :无需 x 权限,且不会在当前 shell 中打开一个子 shell 来执行脚本内容。
    • 方式1和2会打开子 shell 执行脚本内容,执行结束再回到父 shell。
    • 开子 shell 与不开子 shell 的区别就在于,环境变量的继承关系,如在子 shell 中设置的当前变量,父 shell 是不可见的

3. 变量

  1. 常用系统变量:$HOME$PWD$SHELL$USER
  2. 自定义变量:变量名=变量值 ,撤销变量: unset 变量名 ,静态变量:readonly 变量 静态变量不能撤销。export 变量名 提升为全局变量,变量名规则:
    • 环境变量名建议大写
    • 变量默认都是字符串类型,无法直接进行数值运算
    • 变量有空格需用单引号或双引号括起来
  3. 特殊变量:
    • $n :n 为数字,$0 代表该脚本名称,$1 - $9 代表第一到第九个参数,十以上的参数需要用大括号包含,如 ${10}
    • $# :获取所有输入参数个数,常用于循环,判断参数的个数是否正确以及加强脚本的健壮性
    • $* :这个变量代表命令行中所有的参数,$* 把所有的参数看成一个整体;当被双引号包含时,相当于把所有参数拼成了一个字符串
    • $@ :这个变量也代表命令行中所有的参数,不过 $@ 把每个参数区分对待;相当于把所有参数拼成一个集合,只有当被双引号包含时才与 $* 有区别
    • $? :最后一次执行的命令的返回状态。如果这个变量的值为 0,证明上一个命令正确执行;如果这个变量的值为非 0(具体是哪个数,由命令自己来决定),则证明上一个命令执行不正确

4. 运算式

通过 $((运算式))$[运算式] 可以获取并接收一个运算式的值

[linux@CentOS01 ~]$ a=$[1+2+3]
[linux@CentOS01 ~]$ echo $a
6

5. 条件判断

基本语法:

  • test condition
  • [ condition ] ,condition 前后必须有空格

常用判断条件:

  1. 比较 :下面是整数间的比较,如果是字符串之间的比较 ,用等号 = 判断相等;用 != 判断不等
符号含义
-eq等于(equal)
-ne不等于(not equal)
-lt小于(less than)
-le小于等于(less equal)
-gt大于(greater than)
-ge大于等于(greater equal)
  1. 文件权限判断[ -r hello.txt ] 判断 hello.txt 有没有读权限
  2. 文件类型判断-e 文件存在;-f 文件存在并且是常规文件;-d 文件存在并且是一个目录

一般可以直接用 $? 来表示上一条条件判断结果,false 为 0,true 为 1;

还可以用 &&|| 来控制多条件判断及语句执行,&& 表示前一条命令执行成功时,才执行后一条命令,|| 表示上一条命令执行失败后,才执行下一条命令

6. 流程控制

6.1 if 判断

  1. 单分支
if [ 条件判断式 ];then程序
fi

或者

if [条件判断式]
then程序
fi
  1. 多分支
if [ 条件判断式 ]
then程序
elif [ 条件判断式 ]
then程序
else程序
fi

6.2 case 语句

case $变量名 in
"值1")变量值等于值1时执行的程序
;;
"值2")变量值等于值2时执行的程序
;;
"*")变量值都不是上述值执行的程序
;;
esac

6.3 for 循环

语法1:

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

语法2:

for 变量 in 值1 值2 值3...
do程序
done

6.4 while 循环

while [ 条件判断式 ]
do程序
done

7. read 读取控制台输入

基本语法:read (选项) (参数)

  1. 选项:
    • -p :指定读取值时的提示符
    • -t :指定读取值时等待的时间(秒)如果-t 不加表示一直等待
  2. 参数:指定读取值的变量名

8. 函数

8.1 系统函数

  1. basename [string / pathname] [suffix] :取路径里的文件名称,指定了 suffix 会将对应 suffix 去掉
  2. dirname 文件绝对路径 :取文件路径的绝对路径目录,不含文件名

8.2 自定义函数

基本语法:

[function] funcName[()]
{Action;[return int;]
}

function sum()
{s=0;s=$[$1+$2]echo "$s";
}

经验技巧

  1. 必须在调用函数地方之前,先声明函数
  2. 函数返回值,只能通过 $? 系统变量获得,如果不加 return 返回,将以最后一条命令运行结果;如用 return ,后跟数值 n(0-255)

9. 正则表达式入门

正则表达式使用单个字符串来描述、匹配一系列符合某个语法规则的字符串。在很多文本编辑器里,正则表达式通常被用来检索、替换那些符合某个模式的文本。在 Linux 中,grep,sed,awk 等文本处理工具都支持通过正则表达式进行模式匹配

常规匹配:cat a.txt | grep abc 就会匹配所有包含 abc 的行

常用特殊字符

  • ^ :匹配一行的开头,cat a.txt | grep ^a 匹配所有 a 开头的行
  • $ :匹配一行的结束,cat a.txt | grep a$ 匹配所有 a 结尾的行
  • . :匹配一个任意字符,cat a.txt | grep a.b 匹配 aab 、abb 、acb … 的所有行
  • * :不单独使用,和上一个字符连用,表示匹配上一个字符0次或多次
  • \ :转义字符,如 cat a.txt | grep \$ 匹配包含 $ 的行

字符区间:[]

  • [6,8] :匹配6或者8
  • [6-8] :匹配一个 6-8 间的数字
  • [0-9]* :匹配任意长度的数字字符串3
  • [a-z] :匹配一个 a-z 间的字符
  • [a-c,e-f] :匹配一个 a-c 或者 e-f 间的字符

10. 文本处理工具

10.1 cut

cut [选项参数] filename :默认分割符是 \t

选项参数功能
-f列号,提取第几列,可用 , 隔开表示多列
-d分隔符,按照指定分隔符分割列,默认是制表符 \t
-c按字符进行切割后加 n 表示取第几列,如 -c 1

切割 ifconfig 后打印的 IP 地址:

[linux@CentOS01 ~]$ ifconfig ens33 | grep netmask | cut -d " " -f 10
192.168.115.128

10.2 awk

一个强大的文本分析工具,把文件逐行的读入,以空格为默认分隔符将每行切片,切开的部分再进行分析处理

基本语法:awk [选项参数] ‘/pattern1/{action1} /pattern2/{action2}...’ filename

  • pattern :表示 awk 在数据中查找的内容,就是匹配模式
  • action :在找到匹配内容时所执行的一系列命令
选项参数功能
-F指定输入文件分隔符
-v赋值一个用户定义变量

内置变量:

变量说明
FILENAME文件名
NR已读的记录数(行号)
NF浏览记录的域的个数(切割后,列的个数)

切割 ifconfig 后打印的 IP 地址:

[linux@CentOS01 ~]$ ifconfig ens33 | awk '/netmask/ {print $2}'
192.168.115.128

11. 归档文件案例

实现一个当天对指定目录归档备份的脚本,输入一个目录名称(末尾不带/),将目录下所有文件按天归档保存,并将归档日期附加在归档文件名上,放在 /root/archive 下。

这里用到了归档命令:tar ,后面可以加上 -c 选项表示归档,加上 -z 选项表示同时进行压缩,得到的文件后缀名为 .tar.gz 。如需每天执行可结合 crond 服务使用。

脚本实现如下:

#!/bin/bash
# 首先判断输入参数个数是否为 1
if [ $# -ne 1 ]
thenecho "参数个数错误!应该输入一个参数,作为归档目录名"exit
fi# 从参数中获取目录名称
if [ -d $1 ]
thenecho
elseechoecho "目录不存在!"echoexit
fiDIR_NAME=$(basename $1)
DIR_PATH=$(cd $(dirname $1); pwd)
# 获取当前日期
DATE=$(date +%y%m%d)# 定义生成的归档文件名称
FILE=archive_${DIR_NAME}_$DATE.tar.gz
DEST=/root/archive/$FILE# 开始归档目录文件
echo "开始归档..."
echotar -czf $DEST $DIR_PATH/$DIR_NAMEif [ $? -eq 0 ]
thenechoecho "归档成功!"echo "归档文件为:$DEST"echo
elseecho "归档出现问题!"echo
fiexit

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

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

相关文章

特殊的C++vector容器迭代器失效情况:vector iterator not incrementable

众所周知,容器删除元素会使当前使用的迭代器失效,除了重新分配迭代器,还可以使用下面的写法,使删除元素时重新赋值一个有效的迭代器 for(auto iter v->begin();iter!v->end();){if(...){//判断条件iter v->erase(iter)…

X210 Linux开发板挂载NFS文件系统

软件版本 VirtualBox v7.0、Ubuntu 20.04.3 LTS 网络搭建 采用“路由器”“有线网”来将Linux开发板和Ubuntu虚拟机连接在同一个局域网中。具体接线如下: Linux开发板通过网线直接连接到“路由器”的LAN接口上,然后笔记本电脑通过Wifi与路由器连接。…

burpsuite模块介绍之dashboard(仪表板)

导语 "Dashboard主要分为三块:任务、事件日志和动态问题发现" 任务(Tasks):在这个模块中,你可以创建和管理不同类型的任务。其中包括两个预设模板: "来自代理(所有流量)的被动抓取"(live passive crawl from proxy (all traffic)):该任务模板…

纯CSS的华为充电动画,它来了

📢 鸿蒙专栏:想学鸿蒙的,冲 📢 C语言专栏:想学C语言的,冲 📢 VUE专栏:想学VUE的,冲这里 📢 Krpano专栏:想学Krpano的,冲 &#x1f514…

location常用属性和方法

Hi i,m JinXiang ⭐ 前言 ⭐ 本篇文章主要介绍在在JavaScript中location常用属性和方法以及部分理论知识 🍉欢迎点赞 👍 收藏 ⭐留言评论 📝私信必回哟😁 🍉博主收将持续更新学习记录获,友友们有任何问题可…

MySql 第三方工具SQL Sugar

MySQL 是一个非常流行和强大的开源关系数据库管理系统。由于其开源性质,许多第三方工具和库被开发出来,以帮助用户更有效地使用 MySQL。这些第三方工具提供了各种功能,包括数据库管理、SQL 查询生成和优化、备份和恢复等。在这篇博客中&#…

vol----学习随记!!!

目录 一、代码生成1.先新建一个功能的对应的代码配置各项解释: 2.后设置配置菜单3.再点保存,生成vue页面,生成model,生成业务类4.再通过菜单设置编写系统菜单 一、代码生成 1.先新建一个功能的对应的代码配置 各项解释&#xff…

二手房交易流程及避坑指南

文章目录 一、写作目的二、主要流程1、查档2、签定金合同3、网签4、交首付5、解押过户6、出产证7、拿房款8、交房 一、写作目的 近几个月房价一直跌跌不休,对于投资客来说这段时间肯定不好过,但这段时间也正是置换房子的好时候,在这次的房产…

Go语言中支持的internal目录配置与组织内私网包配置详解

Go 中的内部包 这里可能会有歧义 可能是 Go 的 internal 目录中的包也可能是指内部开发的包 函数和变量的可见性 对于函数和变量而言,有如下规则:1 )小写字母开头的函数变量结构体只能在本包内访问2 )大写字母开头的函数变量结…

移动应用开发:揭秘内侧APP封装台的高效

在数字化浪席卷下,移应用已经成连接企业与用户纽带。为了抢占市场先机,快速发布高质量的移动应用成为业竞争的关键。侧APP封装平因此而诞生,成为了应开发者的得助手。以下是内侧APP封装台的全面解读,助在应用开发海洋中乘风破浪。…

基于CMake的大型C++工程组织

此文适合大型C工程,涉及到多个自定义库,多个第三方库,以及还有给第三方用户进行二次开发的需求下,应对这种复杂编译环境下的工程组织方式的一些经验介绍,希望给大型工业软件的开发者一些参考 一个大型工程&#xff0c…

【JavaFX】JDK11 基于Gson、hutool、Jackson持久化存储实体类数据的解决方案 (读取、追加、去重json对象)

文章目录 开发环境效果前言一、Gson是什么?二、使用步骤1.引入依赖2.创建实体类创建 JsonFileService类创建JsonFileService的实现类 JsonFileServiceImpl三、实现效果开发环境 JDK11IDEA 2023.3Gson、hutool、JacksonJavaFX 11效果 前言 使用JDK1

【每日一题】【12.29】 - 【12.31】年终收尾

🔥博客主页: A_SHOWY🎥系列专栏:力扣刷题总结录 数据结构 云计算 数字图像处理 力扣每日一题_ 这三天的题目难度相对较小,基本都为模拟题,但是第二三的题目年份贡献类型很有代表性。2023年最后三天年终收…

MongoDB 数据类型

目录 BSON 类型 二进制数据(Binary Data) ObjectId ObjectId定义 文档中的ObjectId ObjectId的单调性 字符串(String) 时间戳(Timestamps) 日期(Date) BSON类型的排序 数…

I/O多路复用

I/O就是对缓冲区的操作 I/O多路复用使得程序能同时监听多个文件描述符能够提高程序的性能 I/O多路复用是一种有效的处理多个I/O事件的机制,允许一个单独的进程或线程来监视多个文件描述符(sockets、文件、设备等),并在其中任何一个…

Python编程技巧 – format格式化文本

Python编程技巧 – format格式化文本 Python Programming Essentials - Using format() to format texts By JacksonML 本文简要介绍Python语言的format()方法(也即函数)相关实例和技巧,希望对读者有所帮助。 1. format定义和方法 forma…

如何处理并下载Sentinel-5数据

SENTINEL-5是欧洲空间局(European Space Agency,ESA)Copernicus计划中的一颗地球观测卫星。SENTINEL-5的主要任务是监测大气成分,特别是臭氧、氮二氧化物、二氧化硫、甲烷和其他气体的分布。这些观测对于了解大气污染、气候变化和…

php接口优化 使用curl_multi_init批量请求

PHP使用CURL同时抓取多个URL地址 抓取多个URL地址是Web开发中常见的需求,使用PHP的curl库可以简化这个过程。本文将详细介绍如何使用PHP的curl库同时请求多个URL地址,并提供具体的代码案例和注释。 curl库介绍 curl是一个常用的开源网络传输工具&…

图像分割实战-系列教程5:unet医学细胞分割实战3(医学数据集、图像分割、语义分割、unet网络、代码逐行解读)

🍁🍁🍁图像分割实战-系列教程 总目录 有任何问题欢迎在下面留言 本篇文章的代码运行界面均在Pycharm中进行 本篇文章配套的代码资源已经上传 上篇内容: unet医学细胞分割实战2 下篇内容: unet医学细胞分割实战4 5、损…

《Linux详解:深入探讨计算机基础》

《Linux详解:深入探讨计算机基础》 引言: 在计算机科学领域,操作系统是一个至关重要的概念,而Linux作为一种开源的Unix-like操作系统,不仅在服务器领域广泛应用,也在嵌入式系统、超级计算机等多个领域发挥…