• 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)
    #缺点
    	硬盘的读写速度比内存慢很多,反复交换数据会消耗很多时间,所以如果你的内存太小,会严重影响计算机的运行速度,甚至会出现”卡死“现象
    	
    
  • 相关阅读:
    C#通过正则表达式统计词频的一个方法
    本地服务器远程连接其它数据库
    拼字符串成为时间,和两个计算时间点的中间值
    删除文件夹里的图片,打印删除日志
    行转列SQL语句
    加载出一个有层次的下拉框
    查询结果列传行
    【Java&Python双管齐下复健002】回文数和反转数
    【Java&Python双管齐下复健001】冒泡排序和质数判断
    【LeetCode记录】初级算法:数组之删除排序数组中的重复项
  • 原文地址:https://www.cnblogs.com/syy1757528181/p/13553570.html
Copyright © 2020-2023  润新知