Linux【系统学习】(shell篇)

1 Shell 概述

1Linux 提供的 Shell 解析器有 

Ubuntu 使用的是dash

2bash sh 的关系

3Centos 默认的解析器是 bash

2 Shell 脚本入门

1)脚本格式 (结尾不是必须以 .sh 结尾,只是为了区分
脚本以#!/bin/bash 开头(指定解析器)
2)第一个 Shell 脚本:helloworld.sh
1)需求:创建一个 Shell 脚本,输出 helloworld
(2)案例实操:
(3)脚本的常用执行方式
第一种:采用 bash sh+脚本的相对路径或绝对路径(不用赋予脚本+x 权限)
sh+脚本的相对路径

sh+脚本的绝对路径

bash+脚本的相对路径

bash+脚本的绝对路径 

 第二种:采用输入脚本的绝对路径或相对路径执行脚本(必须具有可执行权限+x,之前不需要是因为执行的是bin下的bash脚本,而文件是参数,这里相当于单独执行

①首先要赋予 helloworld.sh 脚本的+x 权限

②执行脚本  
相对路径

绝对路径 

注意:第一种执行方法,本质是 bash 解析器帮你执行脚本,所以脚本本身不需要执行权限。第二种执行方法,本质是脚本需要自己执行,所以需要执行权限。
【了解】第三种:在脚本的路径前加上“.”或者 source
①有以下脚本

②分别使用 shbash./ . 的方式来执行,结果如下:

原因:
前两种方式都是在当前 shell 中打开一个子 shell 来执行脚本内容,当脚本内容结束,则子 shell 关闭,回到父 shell 中。
第三种,也就是使用在脚本路径前加“.”或者 source 的方式,可以使脚本内容在当前shell 里执行,而无需打开子 shell!这也是为什么我们每次要修改完/etc/profile 文件以后,需要 source 一下的原因。
开子 shell 与不开子 shell 的区别就在于,环境变量的继承关系,如在子 shell 中设置的当前变量,父 shell 是不可见的。

3 章 变量

3.1 系统预定义变量

1 )常用系统变量
$HOME、$PWD、$SHELL、$USER 等
命令    env 可以查看当前 系统 全局 变量
2)案例实操
1)查看系统变量的值

(2)显示当前 Shell 所有变量set

3.2 自定义变量

这里有一个很重要的概念,外部shell的全局变量对于内部嵌套的子shell是共享的,但是局部变量子shell不可见。和java不太一样。即便是全局变量,子shell更改了它的值,也只是在子shell里面赋值,退出之后的父shell并没有变化。

1)基本语法
1)定义变量:变量名=变量值,注意,=号前后不能有空格
(2)撤销变量:unset 变量名
(3)声明静态变量:readonly 变量,注意:不能 unset
(4)声明全局变量:先声明并赋值一个局部变量,然后在外层shell 使用 export【变量名】,这个全局变量,只在当前会话有效
2)变量定义规则
1)变量名称可以由字母、数字和下划线组成,但是不能以数字开头,环境变量名建 议大写
(2)等号两侧不能有空格
(3)在 bash 中,变量默认类型都是字符串类型,无法直接进行数值运算。
(4)变量的值如果有空格,需要使用双引号或单引号括起来。
3)案例实操
1)定义变量
(2)给变量 A 重新赋值 

 

(3)撤销变量

(4)声明静态的变量 B=2,不能 unset

(5)在 bash 中,变量默认类型都是字符串类型,无法直接进行数值运算

(6)变量的值如果有空格,需要使用双引号或单引号括起来

(7)可把变量提升为全局环境变量,可供其他 Shell 程序使用

 helloworld.sh 文件中增加 echo $B

发现并没有打印输出变量 B 的值

3.3 特殊变量

3.3.1 $n

1 )基本语法
$n (功能描述:n 为数字,$0 代表该脚本名称,$1-$9 代表第一到第九个参数,十以上的参数,十以上的参数需要用大括号包含,如${10})
补充:单引号勾选的内容不会把变量符号  $ 识别为变量符号,而是识别为字符串。双引号可以正常识别
2 )案例实操

3.3.2 $#

1 )基本语法
$# (功能描述:获取所有输入参数个数,常用于循环, 判断参数的个数是否正确以及加强脚本的健壮性)
2 )案例实操

3.3.3 $*$@

1 )基本语法
$* (功能描述:这个变量代表命令行中所有的参数,$*把所有的参数看成一个整体
$@ (功能描述:这个变量也代表命令行中所有的参数,不过$@把每个参数区分对待,类似于数组
2 )案例实操

3.3.4 $

1 )基本语法
$?功能描述最后一次执行的命令的返回状态。如果这个变量的值为 0,证明上一个命令正确执行;如果这个变量的值为非 0(具体是哪个数,由命令自己来决定),则证明上一个命令执行不正确了
2 )案例实操
判断 helloworld.sh 脚本是否正确执行

4 章 运算符

在此之前,想要计算表达式,可以借助 expr 命令,但是想要获取值相当于把输入的运算符当作一个参数,那么此前我们要求字符间不能有空格,现在就必须添加空格。但是像乘号 * 这样还作为通配符的符号,我们还需要加反斜杠转义,太麻烦了,所以特别增添运算符来帮助获取具体的值

想要把表达式的值传入别的表达式,只能通过反引号包裹,或者是: $($(expr xxxx))

1 )基本语法
“$((运算式))” 或 “$[运算式]”
2)案例实操:
计算(2+3)* 4 的值

5 章 条件判断 

-z : 判断是否是0值

3)案例实操 

6 章 流程控制(重点)

6.1 if 判断

1)基本语法 

为了防止出现空指针异常,有时候通过字符串拼接的方式避免,会这么写  if [ '$1'x = 'fanxy'x ]  

组合判断,可以用多个中括号,或者采用 -a (and)在同一个中括号进行判断。

2 )案例实操
输入一个数字,如果是 1,则输出 banzhang zhen shuai,如果是 2,则输出 cls zhen mei
如果是其它,什么也不输出。

6.2 case 语句

1 )基本语法

6.3 for 循环

双小括号在Linux里面就可以直接使用数学表达式了。

 注意不被括号引起来,两者没有区别!

6.4 while 循环 

这里其实想用高级语言的写法,不想使用靠 $ 符号来完成的赋值造成使用太多中括号的麻烦,可以选择通过使用: let sum+=i 

即 let 命令

7 read 读取控制台输入 

这里就不能使用 $1 $2 这种获取参数的方式了,这是执行脚本的参数。

8 章 函数

8.1 系统函数

想要在脚本中,执行外面的系统函数,需要通过 $() 进行表达式替换,直接写会被当成字符串

8.1.1 basename

8.1.2 dirname

但有时候想获取绝对路径的时候,我们当前执行命令的path是相对路径,我们为了保证能获取绝对路径,可以通过cd和pwd来达到效果  path=(cd $(dirname $0); pwd)

 8.2 自定义函数

调用前必须先声明!shell逐行执行!

方括号内容代表可有可无!传入的形参不需要专门定义名字,使用  $? 系统变量

注意!!!! : return  数值 (0 - 255) 调用函数不需要加括号,空格隔开即可

想要返回范围外的数值,可以通过echo,然后获取返回值的时候,通过赋值的方式,当然让函数返回值需要通过   $()  包裹,进行表达式替换

9 章 正则表达式入门

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

9.1 常规匹配

9.2 常用特殊字符

^xxxxx$ : 代表只能匹配和xxxxx完全相同的内容行,并不是指定的开头结尾

所以 ^$ :匹配所有空行

而为了完成达成我们指定开头和结尾的目标,可以利用 * 和 . 结合

如匹配 a 开头 en 结尾: ^a.*en$

指定中间出现某字符,即利用  .* 组合包裹住 指定字符即可

[ ] 中括号可以不用 ,分割,但是分割可读性更好

不光加上转义字符,还需要加单引号!

为了使用拓展的正则规则,可以通过命令追加  -E  就可以使用如 {数字}  代表出现数字次数

10 章 文本处理工具

10.1 cut

列号分割,可以指定多个列号,用逗号隔开,也可以指定类似正则的范围,如 

1到6  :    1-6                                   3以内  :    -3                                         4以上:   4-

10.2 awk

用管道的话就不需要指定文件名了

BEGIN 和 END 分别代表所有数据读取行之前执行,和所有数据读取之后执行

awk分割空格的时候不予处理,直接按第一个词作为索引1

11 章 综合应用案例

11.1 归档文件

#!/bin/bash

# 判断参数个数是否为1

if [ $# -ne 1 ]
then
        echo "参数个数错误!应该输入一个参数,作为归档目录名!"
        exit
fi

# 从参数中获取目录名称,这里多余的echo是为了空行
if [ -d $1 ]
then
        echo
else
        echo
        echo "目录不存在!"
        echo
        exit
fi

# 获取日期和路径

DIR_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 "开始归档..."
echo

tar -czf $DEST $DIR_PATH/$DIR_NAME

if [ $? -eq 0 ]
then
        echo
        echo "归档成功"
        echo "归档文件为:$DEST"
        echo
else
        echo "归档出现问题"
        echo
fi

exit

然后我们通过 crontab -e 进行编辑系统定时任务,即可完成我们脚本的自动化部署

11.2 发送消息

这里 grep    -i   :忽略大小写

grep  -m  : 最大匹配个数

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

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

相关文章

ModaHub魔搭社区:基于 Amazon EKS 搭建开源向量数据库 Milvus

目录 01 前言 02 架构说明 03 先决条件 04 创建 EKS 集群 05 部署 Milvus 数据库 06 优化 Milvus 配置 07 测试 Milvus 集群 08 总结 01 前言 生成式 AI(Generative AI)的火爆引发了广泛的关注,也彻底点燃了向量数据库&…

【网络原理之三】应用层协议HTTP和HTTPS

HTTP什么是HTTP工作过程协议格式协议内容HTTP请求MethodURLURL的encode和decode Version请求报头请求正文 HTTP响应状态码响应报头 HTTPSHTTPS执行过程加密对称加密非对称加密 证书 HTTP 什么是HTTP HTTP:超文本传输协议。是一种应用非常广泛的应该层协议。 所谓 “…

图片加载失败捕获上报及处理

图片加载失败捕获上报及处理 前端页面中加载最多的静态资源之一就是图片了,当出现图片加载失败时,非常影响用户体验。这时候我们就需要对图片是否成功加载进行判断,并对图片加载失败进行处理。 图片加载监听 单个捕获 HTML中的img标签可以…

集群 第一章

目录 1.群集的含义 2.群集分类 3.群集架构 4.负载调度工作模式 5.lvs 虚拟服务器 6.nat 模式 lvs 负载均衡群集部署 7.总结 1.群集的含义 由多台主机构成,但对外只表现为一个整体,只提供一个访问入口(域名与IP地址)&#…

威胁和漏洞管理增强远程 IT 安全性

威胁和漏洞管理是保护组织设备和数据的主动方法。它可以帮助管理员识别漏洞并检查安全设置是否薄弱。通过使用此方法,可以在任何弱点成为安全漏洞之前对其进行修复。 对远程威胁和漏洞管理工具的需求 随着越来越多的员工远程工作,网络攻击的可能性也在…

计算机网络————网络层

文章目录 网络层设计思路IP地址IP地址分类IP地址与硬件地址 协议ARP和RARPIP划分子网和构造超网划分子网构造超网(无分类编址CIDR) ICMP 虚拟专用网VPN和网络地址转换NATVPNNAT 网络层设计思路 网络层向上只提供简单灵活的、无连接的、尽最大努力交付的数…

基于django的数据可视化展现

今天给大家简单分享一下一个基于python的django的框架写的一个数据可视化的项目。 主要涉及技术:django基础,python基础,前端(html,echars)基础。 这个项目自然而然是基于python逻辑语言处理的&#xff0…

CSDN创作常用操作说明

CSDN创作 目录标题文本样式列表图片连接代码表格UML图Mermaid流程图Flowchart流程图classDiagram类图快捷键 目录 创建目录的方式: [TOC](目录)标题 # 一级标题 ## 二级标题 ### 三级标题 #### 四级标题 ##### 五级标题 ###### 六级标题文本样式 **加粗文本** ~…

第一章 Android 基础--开发环境搭建

文章目录 1.Android 发展历程2.Android 开发机器配置要求3.Android Studio与SDK下载安装4.创建工程与创建模拟器5.观察App运行日志6.环境安装可能会遇到的问题7.练习题 本专栏主要在B站学习视频: B站Android视频链接 本视频范围:P1—P8 1.Android 发展历…

Springboot整合mybatisplus实战

Springboot整合mybatisplus,纯后端,验证结果是通过postman调用的,记录一下 1、建表语句以及初始化数据脚本 CREATE TABLE tbl_book (id int NOT NULL AUTO_INCREMENT,type varchar(20) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT…

Nginx 安装 headers-more-nginx-module 扩展,隐藏www服务信息

通过Ubuntu APT安装的Nginx默认是没有扩展的,所以需要手动安装才可以。本文主要分享如何在 APT 安装 Nginx 的环境中安装 headers-more-nginx-module 扩展,隐藏www服务信息。 1、起因 今天收到一个高危漏洞的警告,该漏洞大意为:…

Kubernetes 服务发布方式(蓝绿发布、灰度发布和滚动发布)

目录 一、三种常用的项目发布方式1.1 蓝绿发布1.2 灰度发布(金丝雀发布)1.3 滚动发布 二、金丝雀的方式升级发布实验三、总结 一、三种常用的项目发布方式 应用程序升级面临最大挑战是新旧业务切换,将软件从测试的最后阶段带到生产环境&…

阿里云国际站:为什么当初很多人不看好的阿里云做起来了?

标题:为什么当初很多人不看好的阿里云做起来了?   为什么人们曾经对阿里云的前景充满疑虑,而它现如今却成就了一番事业?这是个我们应当深思的议题。让我们共同走进阿里云的成长之旅,寻求答案的启示。   在阿里云初…

hive关联键 NULL 关联 NULL

结论:关联键 NULL NULL时,不进行关联,即两表关联失败 案例如下: 表A 表B 表A 关联 表B selecta.id as a_id,a.name as a_name,b.id as b_id,b.name as b_name from表A a left join表B b on a.id b.id …

适用于Vue 3的最佳开源分页库

从头开始实现分页可能是一项耗时的任务,需要大量的精力和资源。幸运的是,有几个伟大的开源库可以简化这个过程,提高你的效率。使用分页库可以节省你的时间和精力,使你能够专注于建立你的应用程序的其他更重要的功能。 在这篇文章…

分布式负载均衡 Ribbon

一、Ribbon简介 是Netfix发布的负载均衡,Eureka一般配合Ribbon进行使用,基于HTTP和TCP的客户端负载均衡工具。 只有负载均衡的能力,不具有发送请求的能力,要配合服务通信组件。 RestTemplate 针对各种类型的 HTTP 请求都提供了相…

《Java核心卷1》怎么样?读1,2章草记 | 第12版

文章目录 《Java核心技术卷 一》第一章 概述第二章 Java编程环境 图书推荐 《Java核心技术卷 一》 第一章 概述 前言:本书与一些”0基础入门“的书定位感觉是不太一样的,可能就像书名所说,是”核心技术“叭。书中经常将Java语言与 c 进行对比…

什么是内存溢出,什么是内存泄漏?

文章目录 一、什么是内存溢出?二、什么是内存泄漏?三、如何避免? 提示:以下是本篇文章正文内容,下面案例可供参考 一、什么是内存溢出? 假设我们 JVM 中可用的内存空间只剩下 3M,但是我们要创…

[PyTorch][chapter 41][卷积网络实战-LeNet5]

前言 这里结合前面学过的LeNet5 模型,总结一下卷积网络搭建,训练的整个流程 目录: 1: LeNet-5 2: 卷积网络总体流程 3: 代码 一 LeNet-5 LeNet-5是一个经典的深度卷积神经网络,由Yann LeCun在1998年提…

虹科教程 | Linux网络命名空间与虹科PROFINET协议栈的GOAL中间件结合使用

前言 PROFINET是由PI推出的开放式工业以太网标准,它使用TCP/IP等IT标准,并由IEC 61158和IEC 61784 标准化,具有实时功能,并能够无缝集成到现场总线系统中。凭借其技术的开放性、灵活性和性能优势,PROFINET可应用于过程…