shell实战

1. 注意事项

- 开头加解释器
    ```
        #!/bin/bash
        # 以及相关注释说明
    ```
- 变量名大写、局部变量小写,函数名小写
- 遇到执行非0时退出脚本的命令:
    ```
        set -e
    ```
- 打印执行过程的命令:
    ```
        set -x
    ```
- 写脚本一定要先测试再上生产环境

2. 获取随机字符串或数字

-c,–characters=LIST select only these characters

2.1 获取8位字符串随机数
- MD5全程报文摘要算法,此算法对任意长度的信息逐位进行计算,产生一个二进制长度为128位(十六进制长度就是32位)的报文摘要,不同的文件产生相同的报文摘要的可能性是非常小的
```
    echo $RANDOM | md5sum | cut -c 1-8
    cat /proc/sys/kernel/random/uuid | cut -c 1-8
```
2.2 随机8位数字随机数

cksum命令是确保文件从一个系统传输到另一个系统的过程中没有被损坏。这个测试要求校验和在源系统中被计算出来,在目的系统中又被计算一次,两个数字比较,如果校验和相等该文件被认为正确传输了

- %N 十亿分之一秒,纳秒[000000000, 999999999]
```
    echo $RAANDOM | cksum | cut -c 1-8
    date +%N | cut -c 1-8
```

3. 定义一个颜色输出字符串函数

- 终端的字符颜色是用转义序列控制的,是文本模式下的系统显示功能
- 转义序列是以ESC开头,即用\033来完成(ESC的ASCII码用十进制表示是27,用八进制表示是033)
- 书写格式:
    \033[显示方式;前景色;背景色m + 内容 \033]m 
数值 含义
0 默认值
1 高亮
22 非粗体
4 下划线
24 非下划线
5 闪烁
25 非闪烁
7 反显
27 非反显

前景色

数值 含义
30 黑色
31 红色
32 绿色
33 黄色
34 蓝色
35 洋红
36 青色
37 白色

背景色

数值 含义
40 黑色
41 红色
42 绿色
43 黄色
44 蓝色
45 洋红
46 青色
47 白色
    echo -e "\033[m hello \033[m"

    echo -e "\033[0;31;46m hello \033[m"
    显示方式:正常 字体前景色:红色 背景色:青色

4. 批量创建用户

利用useradd 和 passwd

    #!/bin/bash
    USER_FILE=users.txt
    for USER in user{1..5}; do
    if ! id $USER &>/dev/null; then
        PASS=$(echo $RANDOM | md5sum | cut -c 1-8)
        useradd $USER
        echo $PASS | passwd --stdin $USER &> /dev/null
        echo -e "$USER\t$PASS" >> $USER_FILE
        echo "$USER user create successfully."
    else
        echo_color red "$USER already exists.";  
    fi
    done

5. 检查主机存货状态

    #!/bin/bash
    for IP in $@; do
    if ping -c 1 $IP &>/dev/null; then
        echo "$IP is ok."
    else
        echo "$IP is wrong!"
    fi
    done       

6. 系统监控

6.1 系统命令

6.1.1 vmstat
- 借助vmstat工具来分析CPU统计信息
- vmstat(Virtual Memory Statics 虚拟内存统计)命令用来显示Linux系统虚拟内存状态,也可以报告关于进程、内存、I/O等系统整体运行状态
- vmstat[刷新延时 刷新次数]

procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----
 r  b   swpd   free   buff  cache   si   so    bi    bo   in   cs us sy id wa st
 1  0      0 2895176 138760 4284624    0    0    62   187    1    1 22  0 78  0  0


6.1.1.1 (procs)进程信息字段
分类 参数 含义
procs r 等待运行的进程数,数量越大,系统就越繁忙
procs b 不可被唤醒的进程数量,数量越大,系统越繁忙
6.1.1.2 memory(内存信息字段)
分类 参数 含义
memory swpd 使用的Swap空间的大小,单位KB
memory free 空闲的内存容量,单位KB
memory buff 缓冲的内存容量,单位KB
memory cache 缓存的内存容量,单位KB
6.1.1.3 swap(交换分区信息)
- 如果说si和so数越大说明数据经常要在磁盘和内存之间数据交换,系统性能就会越差
分类 参数 含义
swap si(in) 从磁盘中交换到内存中的数据的数量,单位KB
swap so(out) 从内存中交换到硬盘中的数据的数量,单位KB
6.1.1.4 io(磁盘读写)
- bi和bo数越大,说明磁盘的I/O越繁忙
分类 参数 含义
io bi(in) 从块设备读入数据的问题,单位是块
io bo(out) 写到块设备的数据的总量,单位是块
6.1.1.5 system(系统信息字段)
- in和cs数越大,说明系统与接口设备的通信越繁忙
分类 参数 含义
system in(interrupt) 每秒被中断的进程次数
system cs(switch) 每秒钟进行的事件切换次数
6.1.1.6 CPU(CPU信息字段)
分类 参数 含义
CPU us(user) 非内核进程消耗CPU运算时间的百分比
CPU sy(system) 内核进程消耗CPU运算时间的百分比
CPU id(idle) 空闲CPU的百分比
CPU wa(wait) 等待I/O所消耗的CPU百分比
CPU st(steal) 被虚拟机偷走的CPU百分比
6.1.2 free
- 查看内存使用状态
- free [-b|-k|-m|-g]
    - -b 表示以字节为单位
    - -k 表示以KB为单位
    - -m 表示以MB为单位
    - -g 表示以GB为单位
    free -m

                 total       used       free     shared    buffers     cached
    Mem:          1006        687        319          0         98        449
    -/+ buffers/cache:        139        866
    Swap:         1999          0       1999    
6.1.2.1 第一行
分类 含义
total 内存总数,total=used+free
used 已经使用的内存数
free 空闲的内存数
shared 多个进程共享的内存数,0,废弃,永远为0
buffers 缓冲区内存数,buffer用于作为写入磁盘的内容缓冲区
cached 缓存内存数,用于从磁盘中读取的内容缓存
6.1.2.2 第二行
- 用于指示应用程序看到的内存情况,也就是应用程序获取内存大小
参数 算法 含义
- buffers/cache 第一行的used-buffers-cached 已经使用的要减去缓存和缓冲的内存量
+ buffers/cache 第一行的free+buffers+cached 空闲的要加上缓存和缓冲的内存量
6.1.2.3 第三行
分类 含义
total swap总数,默认单位是K
used 已经使用的swap数,默认单位是K
free 空闲的swap数,默认单位是K
6.1.3 查询网络状态
- netstat 选项
选项 含义
-t 列出TCP协议端口
-u 列出UDP协议端口
-n 不使用域名与服务名,而使用IP地址和端口号
-l 仅列出在监听状态网络服务
-a 列出所有的网络连接
   netstat -tlun
   netstat -an | more
   netstat -unt | grep  ESTABLISHED



ping

```
    ping -c 1 www.baidu.com
```
- 在windows下,ping一个地址,默认发送四个数据包,linux下ping是不会自动终止的,需要按ctrl+c终止或用参数-c指定要求完成的回应此时
- 在官方 -c<完成次数> 来设置完成要求回应的次数

if后的[]

- if后面接 command list,可以是函数
- [后面只能是condition expression.

缓冲区与缓存区的区别

- 首先缓冲区跟缓存区都是内容内的。
- 所谓的缓冲区,就是当读取内存数据的时候,内容的数据会先放置在缓冲区,等缓冲区一定程度饱和,一起写入硬盘,所以可以提高读写的速度、减少磁盘IO操作、增加磁盘使用寿命

- 所谓的缓存区,就是如果需要不停地读取文件,原本需要从硬盘读取,那么读取一次后可以将文件放在缓存区内,下次读取的时候直接从缓存区拿就可以了,这是内存之间的读取,速度肯定快

查看网卡信息

- ifconfig

查看某块网卡的信息

- ifconfig 网卡名
```
    ifconfig ens33
```

curl

```
    HTTP_CODE=$(curl -o /dev/null -s -w "%{http_code}" http://www.baidu.com)
```
- -o 表示输出
    - -o /dev/null 表示输出到null
- -s 表示默认状态,就是不打印日志
- -w 表示监控
- "%{http_code}" 表示获取头部状态码
- HTTP_CODE就是接收返回的http_code

curl 详解

grep -v xxx

- cat a.txt | grep -v "grep"
    - 表示对a.txt的结果进行过滤,不要含有"grep"的内容
    - -v表示不要

wc

- 统计
    - wc -l
        - 表示只统计行数