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

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

*基础引入*

执行sh01.sh

*文件流和重定向*

文件流:我们大家应该对一个东西不陌生,编程,那编程这个东西简化一下应该怎么分步骤呢?赵本山老师说过,是不是大象关进冰箱分几步 啊,三步是不是,打开冰箱,大象放进去,关上冰箱,那好,其实我们的编程也就是这样,无非就是一个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)

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

那如果我们换一下呢 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---展示当前目录并退出

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

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

[root@linuxStudy fd]# cat 0

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

变量

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

本地:

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

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

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

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

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

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

局部:

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

位置

但是Vi sh03.sh

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

特殊

$BASHPID

执行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的值,但是在其他里面就不可以了

但是在其他的里面呢,

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

*逻辑判断*

我们刚才讲过一个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): 没有那

个文件或目录

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

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

退出状态和逻辑判断

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

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

*表达式:*

Let命令:算术表达式

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

条件表达式

Test

简化的条件表达式

[]

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

1、

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.查看帮助文档

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

那说起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个数列的循环

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

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

  1. 大数据日知录_腾讯T4专家精心整理:java+大数据+机器学习+数据挖掘+算法大集结...

    前言 本篇文章总共八大部分组成,包括数据挖掘:概念.模型.方法和算法:大数据日知录:架构与算法:大数据算法:数据结构与算法经典问题解析:算法基础:打开算法之门:机器学习算法大集结:Java数据结构和算 ...

  2. java swing jar 字体不一样_终于读完了腾讯T4架构师整理的Java深度学习笔记

    我的一位在腾讯T4的朋友向我这样介绍它: 本书为专业程序员解决实际问题而写,可以帮助你深入了解Java语言和库. 本书将读者群定位在那些打算将Java应用到实际工程项目中的程序设计人员.本书假设读者是 ...

  3. 腾讯T4梳理的必备笔记:自动化测试必掌握的30个核心知识点

    据说有小伙伴金九银十想跳槽入大厂!我靠这份笔记顺利进入BAT哦,所以一定要好好瞅瞅我这份资料~ 资料介绍: 这份资料非常全面,从什么是自动化测试介绍开始到web前端基础,HTML标签,CSS样式,自动 ...

  4. 腾讯视频下载位置_腾讯视频怎么下视频到手机

    很多人都使用腾讯视频,播放器家园网小编给大家分享一下腾讯视频下载位置_腾讯视频怎么下视频到手机相关内容.作为国内首家,全力打造正版视频平台的腾讯视频,将从流畅的观映体验.高清的视觉效果.贴心的分享感受 ...

  5. 腾讯视频下载官方_腾讯视频评论在哪

    本文给大家整理了腾讯视频下载官方_腾讯视频评论在哪方面的内容.腾讯视频影音是一款界面轻松友好,功能全面完善,方便好用,绿色安全,完全免费的.专注视频播放的客户端软件,您可运行腾讯视频影音,在线享受腾讯 ...

  6. 腾讯视频下载电脑_腾讯视频如何设置允许腾讯视频驻留功能

    本文给大家整理了腾讯视频下载电脑_腾讯视频如何设置允许腾讯视频驻留功能方面的内容.腾讯视频不断实践"三网合一"的使命,现已覆盖互联网.电视.移动三大终端,兼具影视.综艺.资讯三大内 ...

  7. 腾讯视频下载安装免费装到手机_腾讯视频怎么上传个人本地视频

    不管这个腾讯视频好用与否,都有一大批用户,本文播放器家园网小编分享腾讯视频下载安装免费装到手机_腾讯视频怎么上传个人本地视频.VIP会员频道聚合海量VIP品质内容,连续签到解锁惊喜奖励.摇一摇抽VIP ...

  8. 腾讯视频网页下载_腾讯视频怎么下载视频

    本文给大家整理了腾讯视频网页下载_腾讯视频怎么下载视频方面的内容.腾讯视频独播剧质量还是可以的,比较给力的是腾讯视频大量买入了老剧的版权,不乏一些比较经典的港剧,还把这些老剧修复了.腾讯视频播放器是一 ...

  9. 腾讯视频真实下载地址_腾讯视频如何多倍速播放视频

    腾讯视频官网版是一款专注视频播放的客户端软件,您可运行腾讯视频,在线享受奇艺网站内全部免费高清正版视频.腾讯视频视频播放器内容丰富,影视更新快,包含腾讯视频所有的视频内容,在线享受腾讯视频站内全部免费 ...

最新文章

  1. linux安装软件tar.bz,CentOS下的几种软件安装方式
  2. 算法导论之排序和顺序统计学
  3. c++排序函数对二维数组排序_JS骚操作之数组快速排序
  4. WPF实现雷达图(仿英雄联盟)
  5. 【thymeleaf】Access to request parameters is forbidden in this context
  6. 计算机四级软件工程知识点,计算机四级考点
  7. JAX-RS协议说明
  8. linux中echo命令不输出换行,shell脚本echo输出不换行功能增强实例
  9. Java 算法 FBI树
  10. java中常用的一些方法
  11. 在同一个公司死磕5-10年,到底值不值得?
  12. ARRIS路由器梅林系统救砖
  13. 福禄克光纤OTDR测试与光损耗测试的区别分析
  14. 圆柱体积计算机公式,圆柱的体积怎么算公式
  15. vscode——记单词插件Qwerty Learner
  16. 一个屌丝程序员的青春(三二三)
  17. 快速上手Ubuntu之安装常用软件篇——打造一个满足基本娱乐办公的Ubuntu
  18. python自定义cmap_python自定义cmap_Python matplotlib的使用并自定义colormap的方法
  19. 一文读懂什么是Python魔法函数
  20. 创建一个angular7加GN-ZORRO的工程

热门文章

  1. asp.net core权限模块的快速构建
  2. 远程服务器端口是否开放(审计)
  3. python 3 关于requests库的 text / content /json
  4. 用visio反向工程画oracle数据库表的结构图
  5. 【计算机网络复习】1.2.2 OSI参考模型
  6. 深度学习环境搭建之Anaconda安装keras
  7. hbase伪分布式配置
  8. Leetcode--450. 删除二叉搜索树中的节点
  9. php操作redis_PHP操作Redis的基本方法
  10. armv7 cortex a系列编程手册_STM32、Cortex-M3和ARMv8-M之间的关联