Shell全套课程2小时速通从小白变高手

news2024/11/23 21:41:49

1.Shell概述

1.1为什么要学shell

​ 1.看懂运维人员编写的shell脚本

​ 2.偶尔会编写一些简单的shell程序来管理集群,提高开发效率

1.2 Shell介于外层应用和LInux内核之间;用来操作Linux内核;

Shell是一个命令行解释器,它接收应用程序用户命令,然后调用操作系统内核;

在这里插入图片描述

Shell还是一个功能强大的编程语言,易编写,好调试,灵活。

2.Shell解析器

sudo vim /etc/shells

在这里插入图片描述

上述简单可见6种;

常用sh , bash

如下图所示,sh软连接到bash

在这里插入图片描述

软连接和硬链接区别?

系统默认的是bash

在这里插入图片描述

3.Shell脚本入门

3.1脚本格式

#!/bin/bash 开头(指定解析器)

3.2需求案例:创建一个脚本输出 helloworld

写一个脚本

#!/bin/bash

echo “helloworld”

[root@192 temp]# vim test.sh
[root@192 temp]# ll
总用量 4
-rw-r--r--. 1 root root 30 4月  23 20:54 test.sh
[root@192 temp]# sudo chmod 777 test.sh 
[root@192 temp]# ll
总用量 4
-rwxrwxrwx. 1 root root 30 4月  23 20:54 test.sh
[root@192 temp]# ./test.sh 
helloworld

执行脚本的三种方式

在这里插入图片描述

但是有可能

在这里插入图片描述

原来sh,bash解析器解析,是将脚本放到shell解析器内部进行解析,不需要权限,
但是./hell.sh	是自己调用自己,脚本需要自己执行,当前文件当然没有执行权限;

4.Shell中的变量

需求在/home/atguigu/目录下创建一个banzhang.txt,在banzhang.txt文件中增加“I love cls”。

在这里插入图片描述

要点:

  1. 脚本创建文件夹 ,习惯用vim,但是脚本种不能使用,因此脚本创建文件 touch banzhang.txt
  2. 脚本写入 touch “***” >> banzhang.txt

4.1系统变量

常见系统变量

H O M E 、 HOME、 HOMEPWD、 S H E L L 、 SHELL、 SHELLUSER等

方便我们找到某一个量,家用户,路径,等

$HOME #未来在使用JAVA_HOME HADOOP_HOME 等都需要定义

4.2自定义变量

4.2.1自定变量

在这里插入图片描述

注意:=左右不要有空格

4.2.2撤销变量

unset A

在这里插入图片描述

4.2.3声明静态变量

readonly 变量

在这里插入图片描述

只读变量,不能unset,想要unset必须当虚拟机重启即可;

4.2.4 定义变量规则

(1)变量名称可以由字母、数字和下划线组成,**但是不能以数字开头,环境变量名建议大写。**JAVA_HOME

(2)等号两侧不能有空格

在这里插入图片描述

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

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

在这里插入图片描述

4.2.5将变量定义为全局变量供其他脚本使用

export D=mm

在这里插入图片描述

特殊变量

$n(功能描述:n为数字,$0代表该脚本名称,$1- 9 代表第一到第九个参数,十以上的参数,十以上的参数需要用大括号包含,如 9代表第一到第九个参数,十以上的参数,十以上的参数需要用大括号包含,如 9代表第一到第九个参数,十以上的参数,十以上的参数需要用大括号包含,如{10})

在这里插入图片描述

在这里插入图片描述

也就是脚本接受参数的写法$n	$0表示自身,其他从1-9表示窗口接收的参数索引;
上图$2接收banzhang 2号参数 $3接收 xihuan$4接收mm

接收参数的一种形式,从命令行输入然后接收作为变量;

在这里插入图片描述

$# (功能描述:获取所有输入参数个数,常用于循环)。

在这里插入图片描述

∗ (功能描述:这个变量代表命令行中所有的参数, * (功能描述:这个变量代表命令行中所有的参数, (功能描述:这个变量代表命令行中所有的参数,*把所有的参数看成一个整体)

@ (功能描述:这个变量也代表命令行中所有的参数,不过 @ (功能描述:这个变量也代表命令行中所有的参数,不过 @(功能描述:这个变量也代表命令行中所有的参数,不过@把每个参数区分对待)

[atguigu@hadoop101 datas]$ vim parameter.sh

#!/bin/bash
echo "$0  $1   $2"
echo $#
echo $*
echo $@

[atguigu@hadoop101 datas]$ bash parameter.sh 1 2 3
parameter.sh  1   2
3
1 2 3
1 2 3

$?(功能描述:最后一次执行的命令的返回状态。如果这个变量的值为0,证明上一个命令正确执行;如果这个变量的值为非0(具体是哪个数,由命令自己来决定),则证明上一个命令执行不正确了。)

5.运算符

基本语法:

(1)“ ( ( 运算式 ) ) ”或“ ((运算式))”或“ ((运算式))[运算式]”

(2)expr + , - , *, /, % 加,减,乘,除,取余

注意:expr运算符间要有空格

1.计算3+2的值

在这里插入图片描述

2.计算计算(2+3)X4的值

在这里插入图片描述

采用$[运算式]方式

在这里插入图片描述

6.条件判断

1.基本语法

[ condition ](注意condition前后要有空格)

注意:条件非空即为true,[ atguigu ]返回true,[] 返回false。

  1. 常用判断条件

(1)两个整数之间比较

= 字符串比较

-lt 小于(less than) -le 小于等于(less equal)

-eq 等于(equal) -gt 大于(greater than)

-ge 大于等于(greater equal) -ne 不等于(Not equal)

(2)按照文件权限进行判断

-r 有读的权限(read) -w 有写的权限(write)

-x 有执行的权限(execute)

(3)按照文件类型进行判断

-f 文件存在并且是一个常规的文件(file)

-e 文件存在(existence) -d 文件存在并是一个目录(directory)

案例实操

1.判断23是否大于22

在这里插入图片描述

2.判断某个文件是否有写权限

在这里插入图片描述

3.判断某个文件是否存在

在这里插入图片描述

4.多条件判断 shells是否存在,是否可读

在这里插入图片描述

7.流程控制*

7.1 if 判断

1.基本语法

if [ 条件判断式 ];then

程序

fi

或者

if [ 条件判断式 ]

then

**程序** 

fi

注意事项:

(1)[ 条件判断式 ],中括号和条件判断式之间必须有空格

(2)if后要有空格

案例实操

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

在这里插入图片描述

注意事项:
接收字符串匹配相等需要用     -eq
condition前后需要有空格
条件判断中间要有空格		$1 -eq 1

7.2 case 语句

1.基本语法

case $变量名 in

“值1”)

如果变量的值等于值1,则执行程序1

;;

“值2”)

如果变量的值等于值2,则执行程序2

;;

…省略其他分支…

*)

如果变量的值都不是以上的值,则执行此程序

;;

esac

注意事项:

1) case行尾必须为单词“in”,每一个模式匹配必须以右括号“)”结束。
2) 双分号“**;;**”表示命令序列结束,相当于java中的break。
3) 最后的“*)”表示默认模式,相当于java中的default。

案例实操

1.输入一个数字,如果是1,则输出banzhang,如果是2,则输出cls,如果是其它

在这里插入图片描述

在这里插入图片描述

case接收一个数字然后写in 
接收匹配案例使用  1),2),3),*)		匹配1,2,3和其他
第一个匹配结束后需要双分号结束;;
最终结束符caase的反向拼写结束esac

7.3 for 循环

1.基本语法1

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

do 

​ 程序

​ done

与Java的区别
条件那一栏是双括号,但是里面内容一样
原来的大括号{}	变为现在的do,done
中间的一样;

案例

1.从1加到100

在这里插入图片描述

中间的程序
s=$[$s+$i]		#表示取出s和i的值进行相加后的结果赋值给变量s
s=expr $s + $i	这是另一种写法 

2.基本语法2

for 变量 in 值1 值2 值3…

do

程序 

done

案例实操

1.打印所有输入参数

在这里插入图片描述

在这里插入图片描述

$*表示所有参数输入 的
echo ""		内部也可以使用$i	进行取值操作

在这里插入图片描述

在这里插入图片描述

观察输出结果;
若带“”的话,$*	会将你输入的所有参数当成一个整体,循环仅执行1次
而带“”的$@		还是每一次都接收你输入的单个参数,循环执行多次;

7.4 while 循环

1.基本语法

while [ 条件判断式 ]

do

	程序

done

从1加到100

在这里插入图片描述

此行代码少了echo,请补上:
echo $s

在这里插入图片描述

8.read读取控制台输入

基本语法

​ read(选项)(参数)

​ 选项:

-p:指定读取值时的提示符;

-t:指定读取值时等待的时间(秒)。

参数

​ 变量:指定读取值的变量名

读取控制台的值,赋值给一个变量

案例:提示7秒内,读取控制台输入的名称

#!/bin/bash

read -t 7 -p "Enter your name in 7 seconds " NAME
echo $NAME

最终输入的变量,是需要赋值给NAME的

在这里插入图片描述

在这里插入图片描述

注意:NAME直接在read指令种定义的变量;

9.函数

9.1系统函数

1.basename基本语法

basename [string / pathname] [suffix]     (功能描述:basename命令会删掉所有的前缀包括最后一个(‘/’)字符,然后将字符串显示出来。

选项:

suffix为后缀,如果suffix被指定了,basename会将pathname或string中的suffix去掉。

例子:获取输入路径的basename

在这里插入图片描述

在这里插入图片描述

先使用条件判断banzhang.txt不存在

使用basename获取输入路径的basename;不存在的也可获取;

#请注意
$?	也是需要echo的,因为其具有返回值;

在这里插入图片描述

也就是说加上后缀的话,会将后缀进行匹配然后干掉后输出;

在这里插入图片描述

2.dirname基本语法

​ dirname 文件绝对路径 (功能描述:从给定的包含绝对路径的文件名中去除文件名(非目录的部分),然后返回剩下的路径(目录的部分))

小结:是返回路径的,与basename相反

在这里插入图片描述

9.2自定义函数

基本语法

[ function ] funname[()]

{

​ Action;

​ [return int;] #return一般不采用此方式,一般采用$?方式返回是否执行成功

}

funname

经验技巧

1.必须先声明函数,然后再调用,shell是逐行执行,不会向其他语言一样先编译。和python都是解释型语言;

2.返回值只能通过$?系统变量获得,可以显示加:return 返回,如果不加,将以最后一条命令运行结果,作为返回值,return后跟数值n(0-255)

案例:计算两个输入参数的和

在这里插入图片描述

在这里插入图片描述

注意点:read函数 -t -p严格按先后顺序,先-t后-p
调用函数的实参无括号
定义函数无形参

10.Shell工具***

开发中重点中重点

cut

cut的工作就是“剪”,具体的说就是在文件中负责剪切数据用的。cut 命令从文件的每一行剪切字节、字符和字段并将这些字节、字符和字段输出

cut [选项参数] filename

选项参数功能
-f列号,提取第几列
-d分隔符,按照指定分隔符分割列

案例

数据准备

[atguigu@hadoop101 datas]$ touch cut.txt
[atguigu@hadoop101 datas]$ vim cut.txt
dong shen
guan zhen
wo  wo
lai  lai
le  le

切割cut.txt的第一列

在这里插入图片描述

小结:

cut命令只能按列进行切割;

命令进行指定;先制定切割 方法-d 后指定 切割得到哪一列 -f

在这里插入图片描述

他会按照空格数严格切分;

获取guan zhen 一行种的guan

在这里插入图片描述

方法:先获取某一行,使用管道符;然后进行cut之间用|连接

获取系统PATH变量值,第二个":"开始后的所有路径

在这里插入图片描述

小结:cut -f选取列的时候支持,号分割选取多列

在这里插入图片描述

小结:

1.切割-d 可以没有分号

2.-f 从第二列往后,-f 2-

3.不支持*号进行计数

切割ifconfig输出内容,切割出ip地址;

技巧grep可以i进行初步过滤

在这里插入图片描述

小结:cut只能切割单个字符,多个字符不支持,其次切割玩可以继续切割

用途,切割大量日志文件种的ip

sed

sed是一种编辑器,它一次处理一行内容。处理时,把当前处理的行存储在临时缓冲区中,称为“模式空间”,接着用sed命令处理缓冲区中的内容,处理完成后,把缓冲区的内容送往屏幕。接着处理下一行,这样不断重复,直到文件末尾。文件内容并没有改变,除非你使用重定向存储输出。

基本用法

sed [选项参数] ‘command’ filename

选项参数
-e 直接在指令列模式上进行sed的动作编辑
命令功能描述
a新增,a的后面可以接字串,在下一行出现
d删除
s查找并替换

案例操作

数据准备

[atguigu@hadoop102 datas]$ touch sed.txt
[atguigu@hadoop102 datas]$ vim sed.txt
dong shen
guan zhen
wo  wo
lai  lai

le  le

(1)将“mei nv”这个单词插入到sed.txt第二行下,打印。

在这里插入图片描述

小结:

命令操作sed需要加""; “2a mei nv” 表示源文件第2行添加mei nv

但是源文件内容不发生改变

(2)删除文件中所有包含wo的行

在这里插入图片描述

(3)将sed.txt文件中wo替换为ni

g表示全局,不加表示第一个操作

在这里插入图片描述

替换,删除操作使用/	表示
替换前面加s
删除后面加d

(4)将sed.txt文件中的第二行删除并将wo替换为ni

在这里插入图片描述

多个指令进行执行,
每执行一个指令,前面加上-e 即可

awk

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

和cut很相似,但是处理规则不同

基本用法

awk [选项参数] ‘pattern1{action1} pattern2{action2}…’ filename

pattern:表示AWK在数据中查找的内容,就是匹配模式

action:在找到匹配内容时所执行的一系列命令

选项参数功能
-F指定输入文件折分隔符
-v赋值一个用户定义变量

实际操作

sudo cp /etc/passwd ./

(1)搜索passwd文件以root关键字开头的所有行,并输出该行的第7列。

在这里插入图片描述

小结:
匹配与cut不同,指定分隔符使用—F
正则表达式需要用单引号引起来 ,内部需要打印,print
		{print $7}			#表示打印第7列
最终需要指定文件

(2)搜索passwd文件以root关键字开头的所有行,并输出该行的第1列和第7列,中间以“,”号分割。

在这里插入图片描述

中间以逗号连接","

(3)只显示/etc/passwd的第一列和第七列,以逗号分割,且在所有行前面添加列名user,shell在最后一行添加"dahaige,/bin/zuishuai"。

在这里插入图片描述

请注意:打印第一列,第七列不需要 “”

在这里插入图片描述

整体逻辑:BEGIN打印---
		中间 打印第一列第七列
		END末尾打印---
指令不改变源文件内容

(4)将passwd文件中的用户id增加数值1并输出

此处比较特殊,他是直接拿i=1进行赋值了,不需要进行$取值操作
-F 切割
-v 定义一个变量

内置变量

变量说明
FILENAME文件名
NR切割后的行数
NF切割后有几个列

在这里插入图片描述

使用awk进行获取ip地址

在这里插入图片描述

sort

将文件进行排序,并将结果标准输出

选项说明
-n依照数值的大小排序
-r以相反的顺序来排序
-t设置排序时所用的分隔字符
-k指定需要排序的列

案例

数据准备

vim sort.sh 
bb:40:5.4
bd:20:4.2
xz:50:2.3
cls:10:3.5
ss:30:1.6

(1)按照“:”分割后的第三列倒序排序。

在这里插入图片描述

-t指定切法

-n数字排序

-r倒叙

-k指定列

最终指定文本

11.企业面试题*

问题1:使用Linux命令查询file1中空行所在的行号

awk '/^$ {print NR}' file1.txt
难点:空行正则表达式:就是 ^$
空行的使用场景:日志种,突然冒出大段空行,那么一定会存在异常,得会调用;
null
404
500等数据清洗 -- ETL

问题2:有文件chengji.txt内容如下:

张三 40

李四 50

王五 60

使用Linux命令计算第二列的和并输出

cat chengji.txt | awk -F " " '{sum+=$2} END{print sum}' 
逻辑思路:先将所有的第二列的值进行查询,然后正则将其相加{sum+=$2}		#也就是将第二列数据相加
最终打印sum

问题3:Shell脚本里如何检查一个文件是否存在?如果不存在该如何处理?

#!/bin/bash

if [ -f file.txt ]; then
   echo "文件存在!"
else
   echo "文件不存在!"
fi
-f 文件存在并且是一个常规的文件(file)

-e 文件存在(existence)   

问题4.用shell写一个脚本,对文本中无序的一列数字排序

sort -n test.txt|awk '{a+=$0;print  $0}END{print "SUM"=a}'

问题5:请用shell脚本写出查找当前文件夹(/home)下所有的文本文件内容中包含有字符”shen”的文件名称

grep -r "shen" /home | cut -d ":" -f 1

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

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

相关文章

算法课程笔记——如何进制转换

python特性 八、为什么负数的补码的求法是反码1 因为负数的反码加上这个负数的绝对值正好等于1111,在加1,就是10000,也就是四位二进数的模,而负数的补码是它的绝对值的同余数,可以通过模减去负数的绝对值得到它的补码&…

2024最新SSL证书在线申请系统源码 | 支持API接口 支持在线付费 二开优化版

内容目录 一、详细介绍二、效果展示1.部分代码2.效果图展示 三、学习资料下载 一、详细介绍 2024最新SSL证书在线申请系统源码 | 支持API接口 支持在线付费 二开优化版 最新SSL证书在线申请系统源码 | 支持API接口 SSL证书保证网络安全的基本保障。向您介绍我们的在线生成SSL…

权威解析Spring框架九大核心功能(续篇):专业深度,不容错过

作者介绍:✌️大厂全栈码农|毕设实战开发,专注于大学生项目实战开发、讲解和毕业答疑辅导。 推荐订阅精彩专栏 👇🏻 避免错过下次更新 Springboot项目精选实战案例 更多项目:CSDN主页YAML墨韵 学如逆水行舟&#xff0c…

速度与激情:超高速--100G网卡篇

在数字化时代,信息传输的速度和效率成为了各个领域的关键。在这个快节奏的世界里,网络连接的快慢直接影响着工作效率、生活质量甚至是创新能力。而在网络连接技术中,网卡的作用举足轻重。近年来,随着网络技术的不断发展&#xff0…

路由引入,路由过滤,路由策略简单实验

实验要求: 1、按照图示配置 IP 地址,R1,R3,R4 上使用 1oopback 口模拟业务网段 2、R1 和 R2 运行 RIPv2,R2,R3和R4 运行 OSPF,各自协议内部互通 3、在 RIP 和 OSPF 间配置双向路由引入&#x…

在PostgreSQL中,如何创建一个触发器并在特定事件发生时执行自定义操作?

文章目录 解决方案示例代码1. 创建自定义函数2. 创建触发器 解释 在PostgreSQL中,触发器(trigger)是一种数据库对象,它能在特定的事件(如INSERT、UPDATE或DELETE)发生时自动执行一系列的操作。这些操作可以…

短期斩获多个访问学者邀请函|高校教师获批CSC赴伦敦大学学院

B老师申报的是2023年CSC西部/地方合作项目,因申报在即,所以时间是第一要素,国家定位在英国及澳大利亚。经过努力,我们先后获得英国布里斯托大学、伦敦大学学院及澳大利亚昆士兰大学等多个邀请函,最终其选择了英国伦敦大…

CSS学习(选择器、盒子模型)

1、CSS了解 CSS:层叠样式表,一种标记语言,用于给HTML结构设置样式。 样式:文字大小、背景颜色等 p标签内不能嵌套标题标签。 2、CSS编写位置 1、行内样式(内联样式):在标签里添加样式&#…

谷歌搜索SEO优化需要做什么?

最基本的要求,网站基础要优化好,让你的网站更加友好地服务于用户和搜索引擎,首先你要保证你的网站也适配手机端,现在手机端,如果你的网站在手机上打开慢,或者没有适配手机端,让用户用手机看着电…

Git merge的版本冲突实验

实验目的 发现 两个分支的 相同文件 怎样被修改 才会发生冲突? 实验过程 1.初始状态 现在目前有1.py、2.py两个文件,已经被git管理。现在我想制造冲突,看怎样的修改会发生冲突,先看怎么不会发生冲突。 目前仓库里的版本是这样…

【MySQL】A01、性能优化-参数监控分析

1、参数监控 1.1、MySQL command 查看 mysql>SHOW STATUS; (服务器状态变量,运行服务器的统计和状态指标) mysql> SHOW VARIABLES;(服务器系统变量,实际上使用的变量的值) mysql> SHOW STATUS …

2024年 团体程序设计天梯赛个人总结

前言: 这是一个悲伤的故事~ 🏆题目传送门 ⭐L1一阶题⭐L1-097 编程解决一切(5分)⭐L1-098 再进去几个人(5分)⭐L1-099 帮助色盲(10分)⭐L1-100 四项全能(10 分&#xff0…

做大模型产品,如何设计prompt?

做GenAI产品,除了要设计好的AI任务流程,合理的拆分业务以外,最重要的就是写好prompt,管理好prompt,持续迭代prompt。 prompt一般有两种形式:结构化prompt和对话式prompt。 结构化prompt的优点是通过规范的…

C++:二叉树进阶

二叉搜索树 二叉搜索树又称二叉排序树,它或者是一棵空树 ,或者是具有以下性质的二叉树 : 若它的左子树不为空,则左子树上所有节点的值都小于根节点的值 若它的右子树不为空,则右子树上所有节点的值都大于根节点的值 它的左右子…

超分中使用的损失函数和经典文章

损失函数 https://towardsdatascience.com/super-resolution-a-basic-study-e01af1449e13 在GAN出现之前,使用的更多是MSE,PSNR,SSIM来衡量图像相似度,同时也使用他们作为损失函数。 MSE 表面上MSE直接决定了PSNR,MSE&#xff…

路径规划算法 | A* 搜索算法

作者:Rachit Belwariar 编译:东岸因为一点人工一点智能 路径规划算法 | A* 搜索算法https://mp.weixin.qq.com/s/lTVkknLWZ4ERYnv8m0JCGQ 动机:为了在现实生活中近似求解最短路径,例如地图、游戏等存在许多障碍物的情况。我们可…

Linux命令超详细介绍

目录 安装 Linux的目录结构: Linux命令入门: Linux命令的基础格式: 例子: ls 参数 选项 注意: 目录切换命令:cd/pwd cd: pwd: 相对路径和绝对路径: mkdir 不用参数: …

非Root用户编译C程序如何生成Core文件

非Root用户编译C程序如何生成Core文件 一.生成core文件的步骤1.设置核心转储文件大小为不限制2.**修改核心转储文件生成路径**3.指定core的生成目录为当前目录下4.测试程序 二.核心转储相关设置文件 一.生成core文件的步骤 1.设置核心转储文件大小为不限制 #查询生成core文件…

云上如何实现 Autoscaling: AutoMQ 的实战经验与教训

01 背景 弹性是云原生、Serverless 的基础。AutoMQ 从软件设计之初即考虑将弹性作为产品的核心特质。对于 Apache Kafka 而言,由于其存储架构诞生于 IDC 时代,针对物理硬件设计,存储层强依赖本地存储,已不能很好地适应现在云的时…