shell初识

参考网站

参考文档

参考网站

C语言中文网

自制小程序

推荐电影:《模仿游戏》

shell介绍

## 什么是编程语言?
编程语言的本质就是一门语言,而语言是一种事物和另外一种事物用来沟通的介质

人=============》编程语言=============》计算机


##什么是编程
分为两个环节
	1、想清楚做事的步骤
    2、用一种计算机能听懂的语言(编程语言)表达出来

## 为何要编程?
为了让计算机帮人去做事,从而解放人力

## 什么是程序
程序就是一堆代码文件

## 什么是进程
进程是程序的运行过程,也可以说是操作系统干活的过程,因为是操作系统负责控制硬件来运行应用程序,进程是一个抽象的概念,反应事务运行状态的一种宏观的概念

ps:进程与进程之间的内存空间是'互相隔离'的

## 计算机体系的三层结构

应用程序
操作系统
计算机硬件

## 什么是shell
shell是一门编程语言,用来与计算机沟通,从而控制计算机的

## 什么是shell解释器
用于解释执行shell语言语法/命令的一个'应用软件'
[root@Centos7 ~]# chsh -l
/bin/sh
/bin/bash
/usr/bin/sh
/usr/bin/bash

## 什么是shell script
用shell这门编程语言编写的程序

## 运行shell程序两种方式
方式一:交互式环境(登录用户之后默认就会进入用户的shell解释器交互式环境)
	优点:输入命令立即拿到代码的运行结果,即时运行
    缺点:无法永久保存代码,退出交互式环境,代码全部丢失
方式二:把代码写到文件中,然后运行
	优点:可以永久保存代码,以便后期重复使用
    缺点:无法即时运行

编程语言分类

	机器语言:直接使用二进制指令去编写程序
​		问题:
​			1、二进制指令难以记忆
​			2、开发复杂:实现一个简单的操作都需要很多条指令才能完成
​	汇编语言:用英文标签替代机器语言的二进制指令编写程序
​		解决的问题:不用记忆二进制指令
​		存在的问题:开发仍然比较复杂
​	高级语言:用人类能理解的表达方式去编写程序
​		1、编译型(C语言,go语言):
​		2、解释型(shell、python):
​	执行效率:机器语言> 汇编语言>高级语言(编译型>解释型)
​    开发效率:机器语言<汇编语言<高级语言

程序和进程

进程:进程就是把硬盘中的代码拿出来,放到内存中运行的过程
变量的调用:就是通过变量名对应的内存中的'内存地址',调用变量值的过程

#僵尸进程
#linux系统父子进程涉及:父进程记录子进程的状态,pid 内存等资源占用
#系统所有的进程都会先进入僵尸进程,子进程运行结束后父进程回收子进程占用的资源,但是会保留其PID,子进程脱离僵尸状态
#父进程活着,子进程死了,但是由于父进程的原因,子进程占用资源没有被回收,那么该子进程被称为僵尸进程
#父进程死了,但是其子进程还活着,该子进程成为孤儿进程,被systemd进程回收,子进程继续工作,然后死去,资源被systemd回收
#子进程结束运行,才会被标记为僵尸进程标签,父进程看到该标签会立即回收其资源,如果不回收,那么,该子进程才会被系统认为是真正的僵尸进程
#僵尸进程过多,会导致系统PID被占满
#但是一般在系统看不到进程进入僵尸状态,僵尸进程出现原因:
	1.父进程回收子进程资源太慢,kill -CHLD ,向父进程发送回收子进程资源的信号 
	2.父进程假死,kill -9,杀死父进程
[root@hass-11 script]# ps aux|grep [Z]+

#进程的状态
进程的运行状态:运行态、就绪态、阻塞态
    并发:看起来是同时运行的
    并行:真正意义上的同时运行,只有'多核'才有并行的可能性


面试题

#取变量的字符长度
[root@hass-11 /]# a=123
[root@hass-11 /]# echo ${a}
123
[root@hass-11 /]# echo ${#a}
3
[root@hass-11 /]# echo ${a}|wc -L
3
[root@hass-11 /]# echo ${a}|awk "{print length}"
3

#切片(左切右不切)
[root@hass-11 /]# msg="hello world"
[root@hass-11 /]# echo ${msg:4}
o world
[root@hass-11 /]# echo ${msg::4}
hell
[root@hass-11 /]# echo ${msg:3:2}
lo

#截断(左右都截)
[root@hass-11 /]# echo ${url#www.}
baidu.com
[root@hass-11 /]# echo ${url#*.}	#非贪婪
baidu.com
[root@hass-11 /]# echo ${url##*.}	#贪婪
com

[root@hass-11 /]# echo ${url%.com}
www.baidu
[root@hass-11 /]# echo ${url%.*}
www.baidu
[root@hass-11 /]# echo ${url%%.*}
www

[root@hass-11 /]# echo $HOSTNAME
hass-11

#替换
[root@hass-11 /]# echo ${url/./}
wwwbaidu.com
[root@hass-11 /]# echo ${url//./}
wwwbaiducom
[root@hass-11 /]# echo ${url//./|}
www|baidu|com

[root@hass-11 test]# touch syy_2020_0{1..5}_linux.txt
[root@hass-11 test]# ll
total 0
-rw-r--r-- 1 root root 0 Aug 25 15:37 syy_2020_01_linux.txt
-rw-r--r-- 1 root root 0 Aug 25 15:37 syy_2020_02_linux.txt
-rw-r--r-- 1 root root 0 Aug 25 15:37 syy_2020_03_linux.txt
-rw-r--r-- 1 root root 0 Aug 25 15:37 syy_2020_04_linux.txt
-rw-r--r-- 1 root root 0 Aug 25 15:37 syy_2020_05_linux.txt
[root@hass-11 test]# for fname in `ls .`;do mv $fname ${fname/_linux/};done
[root@hass-11 test]# ll
total 0
-rw-r--r-- 1 root root 0 Aug 25 15:37 syy_2020_01.txt
-rw-r--r-- 1 root root 0 Aug 25 15:37 syy_2020_02.txt
-rw-r--r-- 1 root root 0 Aug 25 15:37 syy_2020_03.txt
-rw-r--r-- 1 root root 0 Aug 25 15:37 syy_2020_04.txt
-rw-r--r-- 1 root root 0 Aug 25 15:37 syy_2020_05.txt


$变量名 == ${变量名}
${#变量名} :得到变量内容的字符长度
${变量名:2} :显示从变量第三个到最后的全部字符
${变量名:2:5}显示变量第三个到第五个变量
${变量名//被替换者/替换者}  :用替换者去替换全部被替换者
${变量名/被替换者/替换者}:用替换者去替换第一个替换者

总结

[] #test
[[ 变量 =~ 正则表达式 ]]

#计算
$[]
$(())

直接数值运算
[root@hass-11 ~]# echo $[1+1]
2
[root@hass-11 ~]# echo $((1+1))
2
直接变量运算
[root@hass-11 ~]# a=1
[root@hass-11 ~]# b=2
[root@hass-11 ~]# echo $[a+b]
3
[root@hass-11 ~]# echo $((a+b))
3

#测试
()
$()

[root@hass-11 ~]# (umask 0000;mkdir /syy);ll /syy -d;umask
drwxrwxrwx 2 root root 6 Aug 27 09:32 /syy
0022
[root@hass-11 ~]# mkdir www.baidu.com_$(date +%F-%M-%S)_.tar.gz
[root@hass-11 ~]# ll
drwxr-xr-x 2 root root   6 Aug 27 09:35 www.baidu.com_2020-08-27-35-26_.tar.gz

1. test 测试表达式
2. [ 测试表达式 ]
3. [[ 测试表达式 ]]
4. ((测试表达式))
注:
一:1、2、3方式中测试表达式两侧必须有至少一个'空格',4不用
二:1、2等价,3是test的扩展,'支持正则',4常用于计算
三:&&、||、<、>、应用于[[]]中,而不能在[]中,在[]中常用 -a 、-o 、-lt(用于整数)、-gt(用于整数)

#tee命令:
当使用文本重定向时,文字会被重定向到文本文本中,而屏幕中没有显示,此时,若要屏幕中也显示的话就用
tee命令,而tee命令的前一个命令错误输出不会被tee读取,#管道
tee -a file1  :文件file1没有则创建,有则增加内容到后面,而不是覆盖 # -a
tee file1 file2 :同时将文本添加到file1 和file2里面

监控

1.服务器本地监视
    netstat -pantu | grep 80| wc -l  :过滤关键字端口,转化为数字
    netstat -pantu | grep nginx | wc -l  :过滤关键字进程,转化为数字
    ss -pantu | grep 80 | wc -l
    lsof -i tcp:80 | wc -l
2.远端监控服务器端口
    1.nmap 127.0.0.1(自己服务器ip) -p 80 | grep open | wc -l
    2.nc -w 2 127.0.0.1  80 &>/dev/null   -w表示超时时间
3.对服务进程或进程数进行监控
    1.ps -ef | grep nginx | grep -v "grep" | wc -l
    2.ps -C nginx --no-header
4.在客户端模拟用户访问的监控方式,#测试链接是否正常
    wget --spider --timeout=10  --tries=2 www.baidu.com &>/dev/null
    --spider	#加了该参数,wget命令就不会下载
    --timeout	#设置检测时间
    --tries		#设置检测次数
    -q 			#静默模式,不输出结果
    
#!/bin/bash
count=1
read -p "请输入要检测的URL: " url
while true;do
        if [ $count = 4 ];then
                break
        else
                echo "正在进程第${count}次检测..."
                wget --spider --timeout=10 -q --tries=2 $url
                ((count++))
        fi
done

free

[root@hass-11 ~]# free
              total        used        free      shared  buff/cache   available
Mem:(物理内存)        2028116      198164     1269216        9824      560736     1632264
Swap:       1048572           0     1048572

#单位为k
#总大小 已用 剩余 共享内存(管道 队列等) 
#cpu	  真正的运行数据
#内存		暂时存储数据,存取速度快
#磁盘		存储数据,平均磁道时间(目前是5毫秒),平均延迟时间(要考虑磁头转速)
#cache 	  作用于CPU再次读取磁盘中的数据
#buffer	  作用于CPU把新产生的数据存储到内存,再存储到硬盘
#linux系统会把多余的内存用于别的地方,比如buff/cache
#shared		用过的内存中哪些是共享的
#available	开启新的进程,可以使用的总内存

total = used + free + buff/cache 
#把buff中的数据存储到磁盘
[root@hass-11 ~]# sync
#清理buff/cache中的空间,一般用于大量开启进程之前执行
[root@hass-11 ~]# echo 3 > /proc/sys/vm/drop_caches

三剑客

1.grep
	过滤文本,可以直接接受管道输入
2.sed
	非交互编辑文本,与xargs配合才能接受管道输入
3.awk
	编辑列,与xargs配合才能接受管道输入

内存 固态 机械

#对于读写速度
	内存 > 固态硬盘 > 机械硬盘。机械硬盘是靠电机带动盘片转动来读写数据的,而内存条通过电路来读写数据,电机的转速肯定没有电的传输速度(几乎是光速)快。虽然固态硬盘也是通过电路来读写数据,但是因为与内存的控制方式不一样,速度也不及内存。
#加载器
	不管是运行QQ还是编辑Word文档,都是先将硬盘上的数据'复制'到内存,才能让CPU来处理,这个过程就叫作载入内存(Load into Memory)。完成这个过程需要一个特殊的程序(软件),这个程序就叫做加载器(Loader)
#buffer
	CPU直接与内存打交道,它会读取内存中的数据进行处理,并将结果保存到内存。如果需要保存到硬盘,才会将内存中的数据复制到硬盘,这里暂时保存数据的内存空间叫做"buffer缓冲区"
#cache
	CPU通知内存,要调用磁盘中的数据,内存从磁盘中取出数据,放到内存,这里暂时保存数据的内存空间叫做"cache缓冲区"

虚拟内存

img

#原理
	当程序运行需要的空间大于内存容量时,会将内存中暂时不用的数据再写回硬盘;需要这些数据时再从硬盘中读取,并将另外一部分不用的数据写入硬盘。这样,"硬盘"中就会有一部分空间用来"存放内存中暂时不用的数据"。这一部分空间就叫做虚拟内存(Virtual Memory)
#缺点
	硬盘的读写速度比内存慢很多,反复交换数据会消耗很多时间,所以如果你的内存太小,会严重影响计算机的运行速度,甚至会出现”卡死“现象
	
原文地址:https://www.cnblogs.com/syy1757528181/p/13553570.html