shell 字典_腾讯T4周末不陪对象,就为了手打这份shell编程笔记

这个周末,为了某些原因,我把shell编程的一些基础知识进行了相应的整理,这里分享给大家,大家在看的时候,有什么问题可以在下方评论区给我留言呀,欢迎转发

自己纯手打,原创不易,谢谢支持

*基础引入*

f6d3552cd3e167699616ab7b9f3e880e.png

执行sh01.sh

6c80608b959bd84172c4c9327b72de5b.png

*文件流和重定向*

文件流:我们大家应该对一个东西不陌生,编程,那编程这个东西简化一下应该怎么分步骤呢?赵本山老师说过,是不是大象关进冰箱分几步 啊,三步是不是,打开冰箱,大象放进去,关上冰箱,那好,其实我们的编程也就是这样,无非就是一个input一个output,中间的实现过程是不是就可以按照你的习惯自己去书写了啊,对吧,所以文件流或者说IO流其实就是这样的一个概念

那好,我们为什么要在linux中强调这个东西,你们之前学过linux,那你们应该知道linux区别于windows 的一个点是不是就是文件至上 啊,在linux的认知中的,一切皆文件,可能你们用的是图形化界面的linux,那大家可以看一下老师的这一个,是不是里面所有的东西都是文件啊,就是以文件的形式存在的。

重定向:(重定向不是命令)

程序自身都有IO

0:标准输入

1:标准输出

2:错误输出

输出重定向

控制程序IO位置:本身我们的文件是不是一对一的,一一对应,一个输入就是完整的输入到一个输出中啊,然后呢,我们linux干了一件什么事 啊,他找了一个第三者(fd),中间人的意思啊,然后呢,我们的输入连接到第三者,然后由第三者将数据进行相应的转发,转发到我们想要他去的位置

cd /prof/$$/fd

Ps -ef 查看进程 ps -ef | grep 13175

举个例子,ls这个命令大家都很熟悉了对吧,我反正拿到一个linux系统,就跟拿到数据库管他怎么样,先来一个select一样,我就先来一个ls,然后再去做别的,那好,那我们知道,ls是不是就是输出显示啊,ll命令就是ls -l的缩写,那他是将当前目录的内容展现到控制台也就是我们的页面上进行相应的显示,对不对,那好,我们前面也说过012这三个属性对吧,对应输出的是不是就是我们的1啊,那我们可不可以通过1这个属性将我们的这个输出位置进行相应的改变啊,好,我们来看一下

ls 1> aaa 在这其中有两个点,

一个是覆盖(ls /tmp 1> aaa)

ca0009d30953d039a2f7807c7fb2be57.png

一个是追加(ls /tmp 1>>aaa)

9858883aa01a3073ca0d867f86786769.png

那如果我们换一下呢 ls / /tmp 1> aaa 这个命令是不是这两个文件夹中的目录都进入我的aaa中了啊,那他的顺序是怎么样的啊,那好,这个地方分成两种情况讨论,

一同级(按照字典序排列),

而上下级(按照上下级排列,也就是我们的目录深度,为什么,因为我们的linux是不是一个目录树的结构 啊 tree -L n)

组合使用

新建 mkdir out

ls / /aabb 1>ls01.out 2>ls02.out(aabb不存在)

那这样写是不是很麻烦啊,可以不可以联系结合到一起啊

ls / /aabb 1>ls03.out 2>ls03.out

按照常理来说是不是从左向右执行,对吧,但是这里为什么没有我们的错误输出呢?好,我们来看一下

ls / /aabb 或者ls /aabb /

我们发现,无论怎么处理,是不是最先输出的是我们的错误日志啊,那也就是说,我的命令

ls / /aabb 1>ls03.out 2>ls03.out

先将错误日志写入到ls03.out中啊,然后当我们再次写入标准输出的时候,会被覆盖掉啊,

ls / /aabb 1>>ls04.out 2>>ls04.out

这样是不是还是很麻烦啊,人比较懒,我不想重写两遍,那我该怎么处理呢?

这里就有一个新的符号&

ls / /aabb 2>&1 1>ls05.out

这里有问题啊,是不是啪啪打脸 啊,我说这里可以用一个&符号,但是为什么会有问题啊?

大家想一下这条命令,我是不是按照顺序进行,是不是有一个2,一个1 啊,那2指向1了,但是1是不是指向控制台啊,也就是说我的错误日志是不是还是在控制台上进行展示啊,然后这个进行完了之后,1又重新指向了ls05.out,那我们这地方考虑一下,换个顺序怎么样?

ls / /aabb 1>ls06.out 2>&1

这样是不是就可以了啊。但是啊,这里注意啊(符号左边不能有空格,,但是右边没问题,是可以的)

ls / /aabb >& ls07.out 和ls / /aabb >& ls07.out这是两个特殊写法 是最简单的特殊写法,记住就可以了)

输入重定向

之前我们写的都是输出重定向,然后接下来就是我们的输入重定向

read aaa <<< "hello world"

read aaa<

cat 0

*shell变量*

exec ls---展示当前目录并退出

d358808dedb3946698349a886cfe1e33.png

exec 8<> /dev/tcp/www.baidu.com/80

[root@linuxStudy fd]# echo -e "GET / HTTP/1.0" 1>&8

[root@linuxStudy fd]# cat 0

0b5551eed963b9c43784692720399596.png

注意点:我们刚才是不是echo发送了一个数据啊,但是我们再次cat的时候他不会发送消息了,为什么,因为我们用的是http1.0的版本,它是一个只会发送一次请求的短连接,我们如果要再次获取数据的话需要再次重新定义,那我们创建了这么多的链接我们该如何删除啊,可以rm -rf吗?不行,我们只能exit退出,没办法,他就是这么任性

变量

那好,我们现在要来定义变量

本地:

当前shell拥有,生命周期随shell进行改变

假设我们定义一个变量aaa=bawei

Echo $aaa 是不是可以展现啊,

01843a757a792499cfb31d76c56bf5d4.png

但是如果我重新开一个链接,是不是就不行了啊

bc77f46b5f2002137b464db30d3a0a25.png

如果是创建本地函数呢,同样的clear

2aebad2fcd89e617bde2c0132d576f6e.png

qwe没有输出值,为啥 啊,是不是我们就没有给他赋值 啊,然后呢qwe=123,我给他赋值,然后我们在使用bawei看一下是不是就有了 啊

7a81711ee9230fe10cb49b21df13da9d.png

局部:

0d81f5662f6d1a9678d6c8686eb3cc0a.png

这一个我们的区别就是我们直接bawei可以取得bbb的值,但是我们直接echo $bbb,就不能获取我们的值

299c95cc9f18bff2c5d89a291f088c5d.png

位置

dcabdac13522cc65559edbbfde291f13.png

但是Vi sh03.sh

6edd58a9f1a683ca405af12e427e95ef.png

Source sh03.sh a b c d e f g h 执行的话没有办法执行啊,怎么办呢,这个地方,当发生重复的时候,我们可以将其括起来echo ${12}

Abc=hello

Echo $abcverygood(不行)======>echo ${abc}verygood

awk -F':' '{print $1}' passwd

这个地方的注意点就是这个{}需不需要单引号,当我们要将其传给bash的话不需要单引号,传给命令的话需要单引号

再说一个简单的例子----数组

[root@linuxStudy sh]# msb=(1,2,3)

[root@linuxStudy sh]# echo $msb

1,2,3

[root@linuxStudy sh]# echo ${msb[1]}

[root@linuxStudy sh]# echo $msb[1]

1,2,3[1]

我们除了可以读取整个数组之外,是不是无法根据下标来进行读取啊,那这个地方怎么办啊,这里就涉及到一个东西,就到分隔符,我们看一下,刚才我们定义的数组是不是通过逗号进行分割的啊,但是linux中,他对于分隔符比较敏感的是不是空格啊,那我们用空格尝试一下

[root@linuxStudy sh]# msb=(1 2 3)

[root@linuxStudy sh]# echo ${msb[1]}

2

特殊

72f71ae66771c2d40833a9e9afd8bf17.png

$BASHPID

b3f1f1698d3fe6975e4af9f50eb1536c.png

执行source sh03.sh a b c d e f g h i j k l m n

$* 与 $@ 区别:

·

相同点:都是引用所有参数。

·

·

不同点:只有在双引号中体现出来。假设在脚本运行时写了三个参数 1、2、3,,则 " * " 等价于 "1 2 3"(传递了一个参数),而 "@" 等价于 "1" "2" "3"(传递了三个参数)。

·

注意点:管道

[root@linuxStudy sh]# a=9

[root@linuxStudy sh]# a=22 | echo grep

grep

[root@linuxStudy sh]# echo $a

9

为什么呢?我们不是设置了a=22 啊,为什么还是现实为9 啊,这就是管道 的一个原理

管道就是把左边命令的输出作为右边命令的输入,这是他最基础的认知 ,那这边,我们的bash和管道是干嘛了呢,他是在左边和右边各启动一个bash,当左边的bash执行完毕后,是不是去执行右边的bash 啊 ,但是我们说了,变量的值是不是执行当前的shell的生命周期啊,对吧,那这样的话当这个bash结束之后是不是他的生命周期就结束了 啊,那他跟我们外面的这个bash有影响吗?没有的,那这个地方有什么用处呢?

这个就是我们的环境变量的问题?

环境

我们之前用过jdk吧,那我们知道jdk配置完成之后要在环境变量中定义

那这个地方就涉及到一个问题,就是bash是如何创建的,bash在管道中的创建,子bash会继承父bash的值,但是在其他里面就不可以了

2c3bec783e59dbfe6f74fe7c31f549b8.png

但是在其他的里面呢,

d7a0af6ed26c1efc695d11f3e5f9af59.png
85aa3e3895d73bf4e7eb2f97557f75c2.png

这里是不是就看出来了,在管道中,是不是无论是否export,我的数值都是可以调用的啊,因为他直接继承父bash的值,但是呢,当我们将其写入到文件中的时候,如果没有export,是不是没有办法找到 啊,因为他无法继承父bash,而且,这里是不能跨bash进行继承,例如我们在创建一个连接就无法调用我这个bash的值

5909a08f4933ec5dfb1a456a23cb7bbd.png

*逻辑判断*

我们刚才讲过一个export,那好,这里再讲解一下

[root@linuxStudy sh]# vi sh05.sh

[root@linuxStudy sh]# chmod +x sh05.sh

[root@linuxStudy sh]# ls

a.out passwd sh01.sh sh02.sh sh04.sh sh05.sh

[root@linuxStudy sh]# ./sh05.sh

.............

99

[root@linuxStudy sh]# a=88

[root@linuxStudy sh]# ./sh05.sh

.............

99

[root@linuxStudy sh]# export a

[root@linuxStudy sh]# ./sh05.sh

88

.............

99

export的一个特性,叫做导出非共享,

[root@linuxStudy sh]# echo $a

88

fork():创建子进程,一个是管道(创建子进程完整复制了父进程的值,可以直接访问),一个是文件(需要export,如果不export的话,无法获取父的值),

Copy on Write

引用和命令替换

单引号:强制引用

双引号:弱引用,不会产生覆盖

[root@linuxStudy sh]# a=99

[root@linuxStudy sh]# echo "$a"

99

[root@linuxStudy sh]# echo '$a'

$a

花括号扩展不会被引用

[root@linuxStudy sh]# cp /etc/inittab /etc/passwd ./

cp:是否覆盖"./passwd"? y

[root@linuxStudy sh]# cp /etc/{inittab,passwd} ./

cp:是否覆盖"./inittab"? y

cp:是否覆盖"./passwd"? y

[root@linuxStudy sh]# cp "/etc/{inittab,passwd}" ./

cp: 无法获取"/etc/{inittab,passwd}" 的文件状态(stat): 没有那

个文件或目录

为什么呢?因为{}外如果添加引用符号,他会默认的将引号之中的路径当做一个文件,这是肯定不行的

4878b7928c8907fbeb1efe603201cbb6.png

Bash执行前删除引用以及反向引用

退出状态和逻辑判断

退出状态就是我之前写的echo $?

逻辑判断 && (一假全假)||(一真全真 )

*表达式:*

Let命令:算术表达式

99a08bb06caf459962a3e65e539fd936.png

主要使用Let c=$a+$b和C=$(($a +$b))(注:可以不加$)

e3ddd683a9723073fdb9014e88dc3480.png

条件表达式

Test

dc138a676e6a3568cf3d21663bb3f903.png

简化的条件表达式

[]

a7da1523c87e91f7d53937625d06a22f.png

*接下来我们要开始书写shell脚本*

3f212d5b7f60fc2288bc2213739881fe.png

1、

b00bea74f1c1e63777dd4d8822abdb50.png

2、判断是否有参数

[ ! $# -eq 1 ] && echo "args error!!!" && exit 2

3、判断用户是否存在

id $1 >&/dev/null && echo "user exist" && exit 3

为什么啊。因为id这个命令大家可以看一下 id 用户名 可以进行相应的查看

4、

`#! /bin/bash`

[ ! $# -eq 1 ] && echo "args error!!!" && exit 2

id $1 >&/dev/null && echo "user exist" && exit 3

useradd $1 >&/dev/null && echo $1 | passwd --stdin $1 >&/dev/null && echo "user add success" && exit 4

echo "i don't know ,user add fail" && exit 5

*流程控制*

If

Help if.查看帮助文档

552321261dfa92ab98d4d2fda4d01b00.png

If test 3 -gt 2; then echo ok ;fi

If test 3 -gt 2;then echo ok;else echo error ;fi

If test 3 -eq 4;then echo ok;elif test 3 -eq 3 ;then echo 3;fi

While

While ls /share;

do

echo ok;

rm -rf /share;

done

注:while后面必须跟一个命令

For

6cc5e6c105b4fc6e88f5789b334a9065.png
aaa1af555c9f952d625ab856de6bd443.png

那说起for来,我们大家应该都不陌生,它有两种不同的方案,是不是普通的for循环和增强for循环啊

For((a=1;a<=5;a++));do echo $a;done

For i in 1 2 3 4 5 ;do echo $i;((i++));done

这里面补充一个简单的seq n它就是打开一个n个数列的循环

9e8d4950e85131aa84978427470141a9.png

相应的内容我已经整理成文档,有需要的文档,可以私信“资料”查看获取方式

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

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

相关文章

Linux如何从普通用户切换到root用户

第一步&#xff1a;打开终端 pwd&#xff1a;Print Working Directory &#xff08;查看当前路径&#xff09; 默认安装完成之后并不知道root用户的密码&#xff0c;那么如何应用root权限呢&#xff1f; (1)sudo 命令 这样输入当前管理员用户密码就可以得到超级用户的权限…

css盒子模型_说说css盒子模型

什么是盒模型引用MDN官方的解释&#xff1a;当对一个文档进行布局&#xff08;lay out&#xff09;的时候&#xff0c;浏览器的渲染引擎会根据标准之一的 CSS 基础框盒模型&#xff08;CSS basic box model&#xff09;&#xff0c;将所有元素表示为一个个矩形的盒子&#xff0…

基于IPP库将FFT函数封装为C++类库并导出为dll(固定接口支持更新)

dll导出C++类的方式 C++类通常有3中导出方式,具体可以参考这篇博客: Dll导出C++类的3种方式 简单来总结一下: 一、纯C语言方式,类似显式传递this指针 缺点 调用创建对象函数的时候编译器无法判断类型是否匹配需要手动调用Release函数,一旦忘记则会造成内存泄露如果导出…

Linux中实现远程登录Xshell和Xftp

1.磨刀不误砍柴工 百度网盘&#xff1a;https://pan.baidu.com/s/1c8YKhKAu_KO52Uw2MSc7WA 提取码&#xff1a;q000 &#xff08;转自https://blog.csdn.net/qq_45260767/article/details/105972350的链接&#xff09; 去百度网盘下载并提取这两个压缩包&#xff08;Xshell…

javaee 中文帮助文档_从中游公司跳槽阿里必知:K8s、Nginx、Redis、微服务面试文档...

前言随着时代的进步和发展&#xff0c;无论哪份工作都不能因循守旧&#xff0c;不去创新或者去吸收新的知识&#xff0c;尤其是Java开发的工作者&#xff0c;在十几年之前&#xff0c;很多人都已经掌握了Java的很多知识&#xff0c;但是如今如果只会SSM的小伙伴&#xff0c;已经…

Linux下安装VIM编辑器,以及简单的VIM指令操作

根据你的Linux版本&#xff0c;输入对应的如下命令&#xff0c;如果是centos系统&#xff0c;故而输入 yum -y install vim* ubuntu 系统输入命令&#xff1a;sudo apt-get install vim-gtkcentos 系统输入命令&#xff1a;yum -y install vim*这时候我们就已经安装好vim了&am…

idea 编译spring_Spring 源码阅读环境的搭建

" 前言本文记录了 Spring 源码环境的搭建方式&#xff0c;以及踩过的那些坑&#xff01;​当前版本&#xff1a;5.3.2-SNAPSHOT。环境准备GitJDK master 分支需要 JDK 115.2.x 分支&#xff0c; JDK8 即可Gradle 6.5.1IDEA 最新 &#xff08;2020.2.3&#xff09;Spring 源…

来自百度的一篇如何关闭Centos7的防火墙以及如何永久关闭防火墙的指令教学【转载】

转载&#xff1a;来自百度的一篇如何关闭Centos7的防火墙以及如何永久关闭防火墙的指令教学 使用命令&#xff1a;systemctl status firewalld.service 查看防火墙状态 2 执行后可以看到绿色字样标注的“active&#xff08;running&#xff09;”&#xff0c;说明防火墙是开…

Linux的Xshell连接Centos7能Ping通但无法连接问题[ssh(d)+firewall(d)]【转载转载转载】

一 方案与思路 0 xshell客户端监测是否能够ping通目标服务器。 前提&#xff1a;知晓目标服务器IP地址 Linux: ifconfig -aWindows: ipconfig -a1 利用firewall工具&#xff0c;检查是否已开启ssh的22端口。若无&#xff0c;则&#xff1a;开启22端口2 利用sshd工具&#xff0…

dubbo web工程示例_分布式开发-Zooker+dubbo入门-Demo

作者&#xff1a;知了堂-刘阳1.什么是SOA架构SOA 是Service-Oriented Architecture的首字母简称&#xff0c;它是一个面向服务的架构模式&#xff08;俗称&#xff1a;分布式&#xff1b;面服务的分布式&#xff09;为什么互联网项目会采用SOA架构呢&#xff1f;随着互联网的发…

Linux如何避免每次开启 CentOS 时,都要手动开启 sshd 服务,防止连接不上Xshell

避免每次开启 CentOS 时&#xff0c;都要手动开启 sshd 服务&#xff0c;可以将 sshd 服务添加至自启动列表中&#xff0c; 输入 systemctl enable sshd.service 可以通过输入&#xff1a;查看是否开启了sshd 服务自启动 systemctl list-unit-files | grep sshd

380免费云存储_三款功能强大的云盘软件,完全替代百度云与腾讯云

众所周知&#xff01;百度云是百度旗下良心产品之一&#xff0c;有免费版&#xff0c;但是免费版限速太厉害&#xff0c;让很多免费用户都难以接受&#xff0c;其次就是腾讯云&#xff0c;腾讯云也是腾讯旗下的良心产品之一&#xff0c;但是两个产品都不是很完美&#xff0c;那…

centos右上角wired图标消失有效解决方案【转载】

突然之间就发现centos7的右上角的网络连接不见了&#xff0c;卧槽&#xff0c;这么神奇的吗&#xff1f;然后又无意中在网上浏览了这个方法&#xff0c;简单又好用 最近在学习Linux配置nginx时&#xff0c;左上角的wired图标突然没了&#xff0c;很神奇。然后在网上按着很多博客…

mysql 关联查询_mysql数据库调优(二)

第五、查询优化1、查询慢的原因&#xff1a;网络因素、CPU、IO、上下文切换、系统调用、生成统计信息、锁等待时间等2、优化数据库访问&#xff1a;查询性能地下的原因是访问的数据太多&#xff0c;某些查询不可避免的需要筛选大量的数据&#xff0c;可以通过减少访问数据量的方…

Linux连接xshell时连不上的问题【转载】

最近这一周由于自己的xshell突然连接不到虚拟机&#xff0c;在网上找了很多种方法也没能解决&#xff0c;以至于自己在学习很多知识的时候都没能很好的去验证&#xff0c;去尝试。最后在求助大佬的时候终于将xshell重新连接到了虚拟机&#xff01;&#xff01; 以下是我对xshel…

Linux的实际操作:关机shutdown、重启reboot、用户注销logout

1.关机和重启命令 &#xff08;1&#xff09;shutdown &#xff1a;shutdown -h now(立即关机) 、shutdown -h 1(1分钟后关机)、shutdown -r now(立即重启) &#xff08;2&#xff09;halt&#xff1a;直接使用&#xff0c;效果等价于关机 &#xff08;3&#xff09;reboot&…

sql 一列中平均应发工资_劳动者的工资标准,应如何认定?

工资是指劳动者付出体力或脑力劳动后所得的对价&#xff0c;体现的是劳动者创造的社会价值。自我国劳动争议仲裁制度建立以来&#xff0c;工资(劳动报酬)争议一直是劳动争议的热点。如何准确把握工资标准的认定&#xff0c;对维护劳动者合法权益、构建和谐稳定的劳动关系具有重…

Linux的实际操作:用户管理(用户添加useradd -d和设置用户密码passwd)

Linux创作者对于用户管理主要体现在两个方面 1.将用户存放到不同的组去进行管理&#xff0c;一个用户可以放在不同的组 2.用户具有“家”目录的概念&#xff0c;当用户登录时&#xff0c;会自动进入到自己的家目录&#xff08;/home&#xff09; 例如&#xff1a;/home/user1…

配置了坐标还是找不到serv_你那么努力,为何还是找不到工作?从优势发展观来看个人职业发展...

扬子的大学专业是金融学&#xff0c;因为父母说学金融有前途&#xff0c;但扬子从小动手能力强&#xff0c;喜欢的是机械设计&#xff0c;因此他在大学期间还辅修了机械工程专业&#xff0c;大二的时候参加过一场业内的机械设计比赛还获得了二等奖&#xff0c;要知道一起参加比…

Linux如何查看所有用户和用户组信息(cat groups whoami)

1.cat /etc/passwd查看所有的用户信息 concatenate files and print on the standard output把文件连接后输出到屏幕上 cat /etc/passwd怎么看呢&#xff1f; 第一个user3是用户名&#xff0c;x是密码&#xff0c; 1002是用户id&#xff0c; 1002是用户组id&#xff0c; /home…