关于Linux中shell 等知识的一些笔记
Posted 山河已无恙
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了关于Linux中shell 等知识的一些笔记相关的知识,希望对你有一定的参考价值。
写在前面
- 笔记是上课后整理的笔记,适合温习,不适合新手,希望对小伙伴有帮助
- 笔记内容包括:Shell一些常见情境
傍晚时分,你坐在屋檐下,看着天慢慢地黑下去,心里寂寞而凄凉,感到自己的生命被剥夺了。当时我是个年轻人,但我害怕这样生活下去,衰老下去。在我看来,这是比死亡更可怕的事。--------王小波
一、Shell 基础知识
1.1 什么是 Shell
shell 是用户 与 Linux 内核之间的解释器
区分 shell 和 bash:shell是解释器的总称,bash是一类解释器。
Bash基本特性
查看当前在使用得解释器,不会显示临时切换的解释器,查看当前系统支持得解释器类型
[root@liruilong ~]$ echo $SHELL #查看当前在使用得解释器,不会显示临时切换的解释器
/bin/bash
[root@liruilong ~]$ cat /etc/shells #查看当前系统支持得解释器类型
/bin/sh
/bin/bash
/sbin/nologin
/usr/bin/sh
/usr/bin/bash
/usr/sbin/nologin
/bin/tcsh
/bin/csh
临时使用其他的解释器,查看设置用户得解释器类型
[root@liruilong ~]$ sh #临时使用其他的解释器
[root@liruilong ~]$ useradd zhangsan #创建用户
[root@liruilong ~]$ cat /etc/passwd | grep zhangsan #查看用户得解释器类型
zhangsan:x:1002:1002::/home/zhangsan:/bin/bash
[root@liruilong ~]$ usermod -s /bin/tcsh zhangsan #修改zhangsan得解释器
[root@liruilong ~]$ cat /etc/passwd | grep zhangsan
zhangsan:x:1002:1002::/home/zhangsan:/bin/tcsh
[root@liruilong ~]$ su - zhangsan #切换用户,验证用户得解释器类型
[zhangsan@liruilong ~]$ echo $SHELL
/bin/tcsh
[zhangsan@liruilong ~]$
Bash的优点
- 快捷键、Tab键补齐
Ctrl + A
#将光标移动到命令行首Ctrl + E
#将光标移动到命令行尾Ctrl + C
#中断正在执行的命令Ctrl + L
#清屏Ctrl + W
#从光标位置,往回删一个单词Ctrl + U
#从光标位置,往回删到开头
- 命令历史 ( history )
[root@liruilong ~]$ history #查看历史记录
[root@liruilong ~]$ history -c #清空历史记录
[root@liruilong ~]$ vim /etc/profile #修改历史记录的数量
46 HISTSIZE=1000
- 命令别名 (alias)
[root@liruilong ~]$ alias #查看当前用户可以使用的别名
[root@liruilong ~]$ vim /root/.bashrc #重开一个终端生效,针对root用户生效
alias ens33='cat /etc/sysconfig/network-scripts/ifcfg-ens33'
[root@liruilong ~]$ vim /etc/bashrc #重开一个终端生效,针对所有用户生效
alias ens33='cat /etc/sysconfig/network-scripts/ifcfg-ens33'
标准输入与输出的重定向 ( >、>>、2>、2>>、&> )
正确输出重定向覆盖,> 等同于 1>
##正确输出重定向覆盖,> 等同于 1>
[root@liruilong ~]$ ls /etc/passwd > /root/1.txt
[root@liruilong ~]$ cat /root/1.txt
/etc/passwd
正确输出重定向追加, 1>> 等同于 1>>
##正确输出重定向追加, 1>> 等同于 1>>
[root@liruilong ~]$ ls /etc/passwd >> /root/1.txt
[root@liruilong ~]$ cat /root/1.txt
/etc/passwd
/etc/passwd
错误输出重定向覆盖追加
##错误输出重定向覆盖
[root@liruilong ~]$ ls --helps 2> /root/2.txt
[root@liruilong ~]$ cat /root/2.txt
ls:无法识别的选项“--helps”
Try 'ls --help' for more information.
##错误输出重定向追加
[root@liruilong ~]$ ls --helps 2>> /root/2.txt
[root@liruilong ~]$ cat 2.txt
ls:无法识别的选项“--helps”
Try 'ls --help' for more information.
ls:无法识别的选项“--helps”
Try 'ls --help' for more information.
错误或正确的输出重定向覆盖追加
##错误或正确的输出重定向覆盖
[root@liruilong ~]$ ls /etc/shadow /root/fsdfs &> /root/3.txt
[root@liruilong ~]$ cat /root/3.txt
ls: 无法访问/root/fsdfs: 没有那个文件或目录
##错误或正确的输出重定向追加
[root@liruilong ~]$ ls /etc/shadow /root/fsdfs &>> /root/3.txt
[root@liruilong ~]$ cat /root/3.txt
ls: 无法访问/root/fsdfs: 没有那个文件或目录
/etc/shadow
[root@liruilong ~]$ cat /root/3.txt
ls: 无法访问/root/fsdfs: 没有那个文件或目录
/etc/shadow
管道 ( | )
##管道的应用
[root@liruilong ~]$ cat /etc/passwd | less
[root@liruilong ~]$ echo "123" | passwd --stdin zhangsan
Shell 执行命令的方式
- 交互式 (命令行)
- 人工干预
- 逐条解释执行、效率低
- 非交换式(脚本)
- 需要提前设计
- 批量执行、效率高
- 修改用户的 Shell 解释器:
/etc/shadow
二、脚本设计与运行
2.1 编写Shell 脚本
什么是 Shell 脚本 |
---|
提前将可执行的命令语句写入一个文件 |
顺序执行 |
解释器逐行解释代码 |
第一个 Shell 脚本
编写一个 Hello Word脚本 |
---|
新建文件 |
添加可执行语句 (命令) |
给文件添加 x 执行权限 |
[root@liruilong ~]$ mkdir -p /root/shell/day01
[root@liruilong ~]$ vim /root/shell/day01/first.sh
echo "Hello World"
规范脚本的构成
一个合格规范的脚本应该包含以下这些内容 |
---|
#! 脚本声明 (使用哪种解释器解释代码) |
注释信息 (步骤、思路、用途等),以 # |
可执行的语句 |
[root@liruilong ~]$ vim /root/shell/day01/first.sh
#!/bin/bash
#A test program for Shell.
echo "Hello World"
2.2 执行 Shell 脚本
方法一:需要为文件赋予可执行的权限 |
---|
绝对路径执行 |
相对路径执行 |
[root@liruilong ~]$ chmod +x /root/shell/day01/first.sh #赋予执行权限
[root@liruilong ~]$ /root/shell/day01/first.sh #以绝对路径的方式运行脚本
Hello World
[root@liruilong ~]$ cd /root/shell/day01
[root@liruilong day01]# ./first.sh #以相对路径运行脚本,【.】只得是当前目录
Hello World
方法二:不需要文件有可执行的权限 |
---|
sh 脚本文件名 |
source 脚本文件名 #不会启动子进程,通过pstree 查看进程树 |
[root@liruilong ~]$ chmod -x /root/shell/day01/first.sh #取消脚本的执行权限
[root@liruilong ~]$ ls -l /root/shell/day01/first.sh
-rw-r--r-- 1 root root 58 7月 4 11:03 /root/shell/day01/first.sh
[root@liruilong ~]$ sh /root/shell/day01/first.sh #用开启子进程的方式运行脚本
Hello World
[root@liruilong ~]$ source /root/shell/day01/first.sh #运行脚本时不会开启子进程
Hello World
#!/bin/bash
echo "Hello World"
sleep 100 #休眠100秒
[root@liruilong ~]$ yum -y install psmisc #pstree的软件包
[root@liruilong ~]$ sh /root/hello.sh #终端A上运行脚本
[root@liruilong ~]$ pstree #终端B验证,查看进程树
├─sshd─┬─sshd───bash───sh───sleep
└─sshd───bash───pstree
[root@liruilong ~]$ source /root/hello.sh #终端A上运行脚本
[root@liruilong ~]$ pstree #终端B验证,查看进程树
├─sshd─┬─sshd───bash───sleep
└─sshd───bash───pstree
三、变量
3.1 自定义变量
以固定的名称,存放可以能有变化的值
定义变量
- 定义变量的格式:变量名=变量值
- 取消变量的格式:unset 变量名
注意事项: |
---|
= 两边不能有空格,不要使用关键字做变量名,如:ls、cd等; |
如果变量名已经存在则覆盖之前的变量值; |
变量名称有:字母/数字/下划线,不能以数字开始; |
查看变量
- 查看变量的语法格式:
$变量名
${变量名}
###脚本中得变量并不需要回收,运行完成后系统会自动回收变量
[root@liruilong ~]$ x=12 #给变量x赋值为12
[root@liruilong ~]$ var1=centos #给变量var1赋值为centos
[root@liruilong ~]$ _a=12 #变量名以下划线开头
[root@liruilong ~]$ a_0="hello world" #变量的值可以是字符串
[root@liruilong ~]$ echo $x #输出变量x的值
12
[root@liruilong ~]$ echo $_a #输出变量$_a的值
12
[root@liruilong ~]$ echo $a_0 #输出变量$_0的值
hello world
[root@liruilong ~]$ echo ${var1}6.5 #输出变量 var1的值,为了区分,用{var1}表示
centos6.5
[root@liruilong ~]$ unset x #取消定义的变量x
[root@liruilong ~]$ echo $x #再次输出结果为空
3.2系统预设变量
变量类型 |
---|
环境变量(变量名通常大写,有操作系统维护); |
位置变量(bash内置变量,存储脚本执行时的参数); |
预定义变量(bash内置变量,可以调用但是不能赋值或修改); |
自定义变量(用户自主设置) |
环境变量
环境变量 |
---|
存储在 /etc/profile 或~/.bash_profile |
命令 env 可以列出所有环境变量 |
常见环境变量:PATH、PWD、USER、UID、HOME、SHELL |
[root@liruilong ~]$ echo $PATH #默认搜索路径
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin
[root@liruilong ~]$ echo $UID #当前用户对应得UID号
0
[root@liruilong ~]$ echo $USER #当前系统得登录用户
root
[root@liruilong ~]$ echo $HOME #当前登录用户得家目录
/root
[root@liruilong ~]$ cd /etc/sysconfig/network-scripts/
[root@liruilong network-scripts]# echo $PWD #显示当前用户得所在路径
/etc/sysconfig/network-scripts
[root@liruilong ~]$ [root@liruilong ~]$ echo $SHELL #显示当前用户使用得解释器
/bin/bash
位置变量
位置变量 |
---|
存储脚本执行时的参数: |
使用 $n 表示,n 为数字序列号 |
$1、$2、... 、${10}、${11}、... |
[root@liruilong ~]$ vim /root/shell/day01/user.sh
#!/bin/bash
#test positional parameters.
echo $1
echo $2
echo $3
[root@liruilong ~]$ bash /root/shell/day01/user.sh aa 99 cc
aa
99
cc
- 通过位置变量创建系统账户,配置密码
[root@liruilong ~]$ vim /root/shell/day01/user02.sh
#!/bin/bash
#read username and pass from positional parameters.
useradd "$1" #创建用户
echo "$2" | passwd --stdin "$1" #给用户设置密码
[root@liruilong ~]$ sh /root/shell/day01/user02.sh tom 123
更改用户 tom 的密码 。
passwd:所有的身份验证令牌已经成功更新。
预定义变量
预定义变量 |
---|
用来保存脚本程序的执行信息 |
直接使用这些变量 |
不能直接为这些变量赋值 |
[root@liruilong ~]$ ls /tmp/
[root@liruilong ~]$ echo $? #返回上一条命令的执行状态:0 为正确,非0 为错误
0
[root@liruilong ~]$ cat /root/sfsfsd
cat: /root/sfsfsd: 没有那个文件或目录
[root@liruilong ~]$ echo $? #上一条命令执行失败,返回一个非0值
1
[root@liruilong ~]$ vim /root/shell/day01/pre.sh
#!/bin/bash
echo $0 #输出当前得脚本名
echo $* #输出所有得位置变量
echo $# #输出位置变量得数量
echo $$ #输出脚本的进程号,每次运行脚本进程号不同
[root@liruilong ~]$ bash /root/shell/day01/pre.sh aa bb 88 qq
/root/shell/day01/pre.sh # $0执行结果
aa bb 88 qq # $*执行结果
4 # $#执行结果
3255 # $$脚本进程号
[root@liruilong ~]$
四、变量的扩展应用
4.1 各种引号
多种引号的区别
区别三种定界符 | – |
---|---|
双引号 " " | 允许扩展,以 $ 引用其他变量; |
单引号 ’ ’ | 禁用扩展,即便 $ 也视为普通符号; |
反引号 `` | 将命令的执行输出作为变量值,$() 与反引号等效; |
[root@liruilong ~]# touch a b c #创建的是三个文件
[root@liruilong ~]# touch "a b c" #双引号让其代表一个文件
[root@liruilong ~]# touch 'b c d' #单引号作用这里是与双引号相同
[root@liruilong ~]# ls -l #查看
-rw-r--r-- 1 root root 0 7月 6 09:36 a
-rw-r--r-- 1 root root 0 7月 6 09:36 b
-rw-r--r-- 1 root root 0 7月 6 09:36 c
-rw-r--r-- 1 root root 0 7月 6 09:48 a b c
-rw-r--r-- 1 root root 0 7月 6 09:48 b c d
[root@liruilong ~]# rm -rf "a b c" #删除时要引号引起来
[root@liruilong ~]# rm -rf 'b c d'
[root@liruilong ~]# echo $HOME #输出家目录路径
/root
[root@liruilong ~]# echo '$HOME' #只输出 $HOME 字符串,''屏蔽特殊符号的含义
$HOME
[root@liruilong ~]# echo '$USER id is $UID'
$USER id is $UID
[root@liruilong ~]# echo $USER id is $UID
root id is 0
[root@liruilong ~]# test=`grep root /etc/shadow`
[root@liruilong ~]# test01=$(grep root /etc/shadow)
[root@liruilong ~]# echo $test
root:$6$Uebh9/WEzEaQfT$8b0B6oBgWUTEmYojDW9.6PHOw0.jD7A.SENsHFD/YPwh/L9jRJK0yWAtRF4BEteYZETeMiInp72dTviSKmLZf.:18501:0:99999:7::: dockerroot:!!:18691::::::
[root@liruilong ~]# echo $test01
root:$6$Uebh9/WEzEaQfT$8b0B6oBgWUTEmYojDW9.6PHOw0.jD7A.SENsHFD/YPwh/L9jRJK0yWAtRF4BEteYZETeMiInp72dTviSKmLZf.:18501:0:99999:7::: dockerroot:!!:18691::::::
[root@liruilong ~]#
4.2 read 命令定义变量
read 标准输入取值
read 标准输入取值 |
---|
read 从键盘读入变量值完成赋值 |
格式:read [-p "提示信息"] 变量名 |
-p 可选 ,-t 可指定超时秒数 ,-s 设置是否在终端显示输入的内容 |
交互式定义变量
[root@liruilong ~]# read name #交互式定义变量
haha #输入名字
[root@liruilong ~]# echo $name #查看变量
haha
[root@liruilong ~]# read -p "请输入用户名:" name #交互式定义变量
请输入用户名:xixi
[root@liruilong ~]# echo $name #查看变量
xixi
从键盘读取用户名密码,创建用户并设置密码
[root@liruilong ~]# vim /root/shell/day01/user03.sh
#!/bin/bash
##read 从键盘读取用户名密码,创建用户并设置密码
read -p "请输入一个用户名:" name
read -p "请输入密码:" pass
useradd $name
echo "$pass" | passwd --stdin $name
##脚本测试
[root@liruilong ~]# source /root/shell/day01/user03.sh
请输入一个用户名:nana
请输入密码:123456
更改用户 nana 的密码 。
passwd:所有的身份验证令牌已经成功更新。
read 从键盘读取用户名密码,创建用户并设置密码,要求不显示输入密码
[root@liruilong ~]# vim /root/shell/day01/user03.sh
#!/bin/bash
##read 从键盘读取用户名密码,创建用户并设置密码,要求不显示输入密码
read -p "请输入一个用户名:" name
read -p "请输入密码:" -s pass
useradd $name
echo "$pass" | passwd --stdin $name
##脚本测试
[root@liruilong ~]# source /root/shell/day01/user03.sh
请输入一个用户名:haha
请输入密码:更改用户 haha 的密码 。
passwd:所有的身份验证令牌已经成功更新。
[root@liruilong ~]# vim /root/shell/day01/user03.sh
#!/bin/bash
不输入就会自动退出:如果后面不加秒数,则不会自动退出
##read 从键盘读取用户名密码,创建用户并设置密码,要求不显示输入密码
##-t 多少秒不输入就会自动退出:如果后面不加秒数,则不会自动退出
read -p "请输入一个用户名:" name
read -p "请输入密码:" -s -t 3 pass
useradd $name
echo "$pass" | passwd --stdin $name
##脚本测试
[root@liruilong ~]# source /root/shell/day01/user03.sh
请输入一个用户名:lisi
请输入密码:更改用户 lisi 的密码 。 #超过3秒退出
passwd: 鉴定令牌操作错误
4.3 全局变量 or 局部变量
变量的作用范围
变量的作用范围 | – |
---|---|
局部变量 | 新定义的变量默认只是在当前 Shell 环境中有效,无法在子 Shell 环境中使用 |
全局变量 | 系统中的任何 Shell 环境中都有效 |
####开启两个终端,A和B来测试
#终端A上操作
[root@liruilong ~]# x=11 #定义局部变量
[root@liruilong ~]# sh #进入sh子进程
sh-4.2# echo $x #无此变量,输出为空
#终端B上操作
[root@liruilong ~]# pstree #查看进程树
......
├─sshd─┬─sshd───bash───sh
│ └─sshd───bash───pstree
......
使用 export
定义全局变量
#终端A上操作
[root@liruilong ~]# export x=12 #定义全局变量
[root@liruilong ~]# sh #开启sh子进程
sh-4.2# echo $x #新的解释器里变量也生效
12
sh-4.2# bash #开启bash子进程
[root@liruilong ~]# echo $x #新的解释器里变量也生效
12
[root@liruilong ~]# pstree #查看进程树
......
├─sshd─┬─sshd───bash───sh───bash
└─sshd───bash───pstree
......
五、Shell 中的运算
5.1 整数运算
基本运算法则
基本运算法则 |
---|
四则运算 |
加法:num1 + num2 |
减法:num1 - num2 |
乘法:num1 * num2 |
整除:num1 / num2 |
取余数运算 |
求模:num1 % num2 |
$[] 算式替换
- 使用
$[ ]
或$(( ))
表达式- 格式:$[整数1 运算符 整数2…]
- 计算结果替换表达式本身,可结合 echo 命令输出
[root@liruilong ~]# echo $[1+2]
3
[root@liruilong ~]# echo $[2*3]
6
[root@liruilong ~]# x=15;y=3 #定义两个临时变量x,y
[root@liruilong ~]# echo $[x+y] #加法运算
18
[root@liruilong ~]# echo $[x-y] #减法运算
12
[root@liruilong ~]# echo $[x*y] #乘法运算
45
[root@liruilong ~]# echo $[x/3] #除法运算
5
[root@liruilong ~]# echo $[x%3] #取余运算(除尽)
0
[root@liruilong ~]# echo $[x%2] #取余运算(未除尽)
1
[root@liruilong ~]# x=15;y=3 #定义两个临时变量x,y
[root@liruilong ~]# echo $((x+y)) #加法运算
18
[root@liruilong ~]# echo $((x-y)) #减法运算
12
[root@liruilong ~]# echo $((x*y)) #乘法运算
45
[root@liruilong ~]# echo $((x/y)) #除法运算
5
[root@liruilong ~]# echo $((x%y)) #取余运算(除尽)
0
[root@liruilong ~]# echo $((x%y)) #取余运算(未除尽)
1
[root@liruilong ~]# x=2 #定义变量x=2
[root@liruilong ~]# echo $[x+=4] #输出x值,x=x+4
6
[root@liruilong ~]# echo $x #输出x值
6
变量的自增/减等操作
[root@liruilong ~]# echo $[x+=1] #输出x值,x=x+1
7
[root@liruilong ~]# echo $x #输出x值
7
[root@liruilong ~]# echo $[x*=3] #输出x值,x=x*3
21
[root@liruilong ~]# echo $x #输出x值
21
[root@liruilong ~]# echo $[x++] #输出x+1前的值
21
[root@liruilong ~]# echo $x #这是x+1后的值
22
[root@liruilong ~]# echo $[x--] #输出x-1前的值
22
[root@liruilong ~]# echo $x #输出x-1后的值
21
let 指定算术运算
####let 用于指定算术运算
[root@liruilong ~]# let i=2*3 #将算术运算 2*3 赋予变量 i
[root@liruilong ~]# echo $i
6
[root@liruilong ~]# let i=3*6 #将算术运算 3*6 赋予变量 i
[root@liruilong ~]# echo $i
18
[root@liruilong ~]# b=2 #定义变量
[root@liruilong ~]# let b+=2 #变量赋值,b=b+2
[root@liruilong ~]# echo $b
4
[root@liruilong ~]# let b*=3 #变量赋值,b=b*3
[root@liruilong ~]# echo $b
12
[root@liruilong ~]# x=2
[root@liruilong ~]# let x++;echo $x # ;用来区分两条命令
3
[root@liruilong ~]# let x++;echo $x # ;用来区分两条命令
4
[root@liruilong ~]# let x+=3;echo $x # ;用来区分两条命令
7
5.2 小数运算
bc计算器
Bash 内建机制仅支持整数运算,不支持小数运算
[root@liruilong ~]# echo $[12.2+23]
-bash: 12.2+23: 语法错误: 无效的算术运算符 (错误符号是 ".2+23")
我们可以通过计算器软件bc
实现小数运算
我们没有该软件则需要使用yum
安装; bc支持交换式和非交换式两种计算
,scale=n
可以约束小数位,quit
退出交互式计算
[root@liruilong ~]# yum -y install bc #安装bc软件包
###使用bc进行交互运算
[root@liruilong ~]# bc
12+23 #加法运算
35
23.43*1.243 #乘法运算
29.123
23/2 #除法运算
11
23%3 #取余运算
2
quit #退出命令
[root@liruilong ~]# echo "1.2+3.3" | bc
4.5
[root@liruilong ~]# echo "1.2+3.3;3.8*2.7" | bc #同时进行多个运算
4.5
10.2
[root@liruilong ~]# echo "scale=2;10/2" |bc #scale=2 结果小数位保留两位
5.00
[root@liruilong ~]# echo "scale=2;17/2" |bc
8.50
[root@liruilong ~]# echo "scale=2;17.34/2" |bc #scale=2 结果小数位保留两位
小数的比较
- bc 支持的比较操作符:
>、>=、<、<=、==、!=
- 表达式成立则返回1,否则返回0
[root@liruilong ~]# echo "1>2" | bc #比较错误,1小于2,结果为0
0
[root@liruilong ~]# echo "5>2" | bc #比较正确,5大于2,结果为1
1
[root@liruilong ~]# echo "2==2" | bc #比较正确,2等于2,结果为1
1
[root@liruilong ~]# echo "2!=2" | bc #比较错误,2等于2,结果为0
0
[root@liruilong ~]# echo "12.34 < 8.8" | bc #比较错误,12.34 大于 8.8,结果为0
0
[root@liruilong ~]# echo "12.34 != 8.8" | bc #比较正确,12.34不等于8.8
[root@liruilong ~]# echo "hello world" #echo 默认会换行
hello world
[root@liruilong ~]# echo -n "hello world" #-n 取消 echo 命令的默认换行
hello world
[root@liruilong ~]#
六、综合案例
6.1 监控脚本之显示硬件信息
echo回显
- -n选项:不换行
- -e选项:支持扩展属性
改变echo输出的文本颜色
- echo -e “\\033[文字颜色m 文字 \\033[0m”
- 文字颜色:30 ----------- 37
30:黑 34:蓝色
31:红 35:紫色
32:绿 36:深绿
33:黄 37:白色
[root@liruilong ~]# echo -e "\\033[32m天气预报\\033[0m" #0m还原文字颜色,让颜色只作用
于当前字体
hello #32绿色字
监控硬件信息
显示服务器硬件信息
###最小化安装需要安装查看IP的软件包
[root@liruilong ~]# which ifconfig
/usr/sbin/ifconfig
[root@liruilong ~]# rpm -qf /usr/sbin/ifconfig
net-tools-2.0-0.22.20131004git.el7.x86_64
[root@liruilong ~]# vim /root/shell/day01/info.sh
#!/bin/bash
##显示服务器硬件信息
echo -e "\\033[34m----------服务器硬件信息----------\\033[0m"
Linux系统Bash(Shell)基础知识