Linux Shell
Linux文件系统基础
-
Linux文件系统结构
- /dev 存放设备驱动程序(如磁盘、USB等。将硬件设备文件化)
- /etc 存放各种配置文件(服务器、网络设备等)
- group 存储用户组的相关信息
- profile 创建全局变量,一般存放的是环境变量
- /home 普通用户主目录
- /proc 存放Linux系统所有内核参数以及系统的配置信息(如tcp内核参数等)
- cpuinfo 存储CPU相关信息
- meminfo 存储物理内存和交换内存的使用信息
- devices 当前运行的核心设备驱动列表
- dma 当前使用的DMA通道
- loadavg 显示平均负载,指示系统当前工作量
- /mnt 用于挂载系统之外的文件系统(如光盘、SSD等)
- 访问/dev只能获取设备的一些信息,要访问设备内容还需要进行挂载
- /usr 用户目录,存放用户文件
- /bin 用户可以直接执行的所有命令
- /sbin 需要root权限才可以执行的命令
- /var 运行时要改变的数据
-
文件类型
- 普通文件(-):文本文件、二进制文件等。
- 目录文件(d):文件夹
- 设备文件( c ):表示Linux系统中的所有硬件设备(b 表示块设备文件,如硬盘;c 表示字符设备文件,如键盘和鼠标)
- 链接文件( l ):
- **硬链接:**相当于创建一个镜像副本,并保持同步的更新
- 软链接(符号链接):引用的是文件的路径,类似于Windows系统中的快捷方式
-
文件属性和权限
- 所有者权限 所属组权限 其他人权限 (rwx rwx rwx)
- 根目录 /
- 用户主目录 /home/ 一般用~表示
- 当前目录 ./
- 上级目录 …/
-
用户和用户组管理
Linux是一个多用户多任务的分时操作系统,任何一个想要使用系统资源的人都需要有一个账号。
- useradd(添加用户)
- userdel(删除用户)
- usermod(修改用户)
- passwd(设置密码)
- su -[用户] (su 用户)
- sudo 获得临时权限的提升
- who
- which
实用性:通过添加账户,设置组id等。使得可以通过多个用户远程连接服务器,而不同的用户对服务器具有不同的权限。
-
文件和目录操作
- touch
- rm
- -f 强制删除
- -i 会有询问提示
- cat(查看整个文件)
- tail(查看文件末尾)/more(最多显示多少行)/less(至少显示多少行):查看文件
- wc(统计文件的字符数,行数等信息)
- pwd
- mkdir
- ls -s/-a/-i/-l(显示详细信息)
- mv(移动或对文件重命名)/cp(复制文件)/rm(删除文件)
- chmod(权限管理) / chown(改变文件所有者-改为指定的用户或组)
- file(确定文件的类型)
- find(在指定目录下查找文件)
- grep(查找符合特定表达式的字符或字符串)
-
处理数据文件
-
一般是按行处理文件的数据
-
sort(对文件数据进行排序—按行排序)
-
grep(按行匹配文本中的每一行数据)
- -r 递归
- -v 反取(输出不匹配的行)
- -i 忽略大小写
- -n 显示行号
- -c 计数
- -w 匹配一个词
-
压缩数据(gzip)
- gzip 文件 :压缩文件
- gzip -dv 文件 :解压文件
- gzip -c 待压缩文件 > 压缩名.gz :保留源文件压缩
-
打包数据(tar命令)
- https://cloud.tencent.com/developer/article/1454847
- 打包是将若干个文件打包处理成一个文件,在打包的过程中不改变文件的大小
- 由于压缩一次只能压缩一个文件,所以一般需要先进行一个打包
- tar cvf *.tar 待打包文件 :对文件进行打包
- tar zcvf *.tar.gz 待打包压缩文件 :压缩打包
- tar ztvf *.tar.gz :查看文件(如被压缩,要加上-z)
- tar tvf *.tar :查看文件
- tar zxvf *.tar :解压文件
-
管理文件系统
日志文件系统
日志文件系统中开辟了一个特殊的区域,这个区域中记录的都是写入或者修改文件时的步骤。
分区类型及作用
https://blog.csdn.net/sinat_29581293/article/details/61193245
- 主分区(总共最多只能分为4个)
- 扩展分区(必须再划分成逻辑分区才能使用)
- 逻辑分区(IDE Linux最多支持59)(SCSI Linux最多支持11)
fdisk还可以用于分区的创建;创建分区后可以进行文件系统的创建
https://blog.csdn.net/arenn/article/details/78866251
系统管理
网络管理
- ping(用来判断网络连接是否畅通)
- Ctrl+C退出
- ifconfig(网络配置命令)
- 主要显示的是网卡的信息:MAC地址;IP地址:广播地址:子网掩码;MTU等信息
- https://www.yiibai.com/linux/ifconfig.html
- ifconfig [网络设备] [参数]
- route(显示和配置路由表信息)
- 显示路由信息和配置路由信息
- https://www.jianshu.com/p/414e3d6face3
- netstat(显示网络相关信息,如网络连接、路由表、接口状态等)
- https://www.runoob.com/linux/linux-comm-netstat.html
- 用于显示网络状态,可以得知整个Linux网络系统的一个状态
- netstat -t 显示TCP相关信息
- netstat -u 显示UDP相关信息
- netstat -r 显示路由表相关信息
- netstat -l 显示套接字相关信息
磁盘管理
- https://www.runoob.com/linux/linux-comm-netstat.html
- https://www.jianshu.com/p/520b3a405014
- 功能:显示磁盘信息,如柱面信息、分区数,还能对磁盘进行分区。
- fdsik -l(查看所有磁盘的信息)
监测程序
- ps(静态显示当前进程信息)
- ps -e 和 ps -A 用与显示所有进程信息 https://developer.aliyun.com/article/710681
- **top **实时监测程序
- free查看内存使用情况
- -m(以MB显示)
- -k (以KB显示)
- -b (以bytes显示)
监测磁盘空间
已经使用了多少空间,还有多少空间可以使用
- 挂载外部存储 mount命令
- 基本格式 mount [-t vfstype] [-o options] 设备名称 挂载目录
- 卸载外部存储umount命令
- umount [挂载目录|设备名称]
- 显示剩余磁盘空间
- 查看磁盘的使用信息,包括已用空间、可用空间、挂载点等信息
- df (https://www.runoob.com/linux/linux-comm-df.html)
- 计算磁盘使用量——du命令
- 计算机文件大小;显示指定的目录或文件所占用的磁盘空间
Linux Shell
shell基本命令
- echo的作用是将命令后面的字符串输入到显示器上,一般用来显示提示性的信息或是命令或语句的执行结果
- #!/bin/bash 告知Shell终端执行当前Shell脚本需要用哪种Shell
- $SHELL 获取当前系统默认的SHELL类型
变量与环境变量
- 变量
- 变量名=变量值(等式两边不能有空格)
- 整形:num=10
- 浮点类型:float=1.2
- 字符串:str=“10”
- 显示:echo $num
- 变量的输入
- read [option] 变量名
- 读取一个数:read num
- 同时为多个变量赋值: read -p “输入三个数值:” num1,num2,num3 #为多个变量赋值
- 限定输入的时间: read -t4 num1 #限定等待时间为4秒
- 限定输入字符个数: read -n4 num1 #限定为四个字符
- 输入的内容不显示在终端: read -s passwd
- read [option] 变量名
- 变量的输出
- echo -n “hello” 输出文字后不换行-n
- echo -e 输出某些特殊字符
- echo -e warning:\a 发出警告声,一般是蜂鸣声
shell中的特殊变量
- $0 脚本名称
- $1~$9 脚本执行时输入第一至第九个参数
- $# 输入的参数个数
- $? 脚本返回值
- $* 参数的具体内容–看成一个字符串
- $@ 参数的具体内容–看成一个个的对象
- $$ 终端进程号
环境变量
https://www.jianshu.com/p/3faacdf979e5
env:显示全局环境变量
set:显示本地环境变量
- /etc/profile 系统默认的shell配置文件
- $HOME/.bash_profile 主目录下的profile文件
- $HOME/.profile 用户自身使用的SHELL信息
环境变量的设定
通过export命令进行环境变量的配置
- export MYHOME=/home/test
- echo $MYHOME
使用source命令可以使得环境变量立即生效
环境变量的取消
unset命令
特殊符号
引号的使用
- 单引号
- 将单引号中的所有内容都作为普通字符处理(即使里面的符号时特殊符号)
- 双引号
- 用于字符串的输出。但是美元符号($),倒引号(`)和反斜线(\)仍作为特殊符号对待
- 倒引号
- 以引号中命令的执行结果代替命令本身
通配符和元字符
https://www.linuxidc.com/Linux/2017-08/146463.htm
-
一:基本正则表达式
- 1)使用点字符(.)匹配单字符
- 2)使用定位符
- ^string 匹配以string开头的字符串
- string$ 匹配以string结尾的字符串
- 如果需要匹配以脱字符或美元字符(^、$)开头或结尾的字符需要用转移字符(^,$)
- 3)使用“*”匹配字符串中的单字符或其重复序列
- *可以匹配任意多个字符
-
二:扩展正则表达式
- 1)使用“[]”匹配一个范围或集合
- [a-c] 匹配a,b,c
- [5-9] 匹配5,6,7,8,9
- 2)使用“{}”匹配模式结果出现的次数
- string {n} string正好匹配n次
- string {n,} string至少匹配n次
- string {n,m} string出现次数必须在n~m之间
- 例子:
- A {2}B 匹配AAB
- A {2,}B 匹配AAB,AAAB,AAAAB…
- A {2,3}B 匹配AAB,AAAB,但不匹配AAAAB
- 3)问号的使用
- 匹配出现一次或0次的情况
- 1)使用“[]”匹配一个范围或集合
管道
" | ":竖线前面的命令的执行结果将作为后面命令的执行参数
- 后台运行符:& ---->实现脚本或命令的后台启动
- **大括号{}:用于变量的分辨 ${name} **
- **小括号(): 用于命令的替换 ,等同于倒引号 $(who) 相当于
who
** - 分号;: 用于分割语句
shell结构化命令
测试命令
- test expression
- [ expression ] :符号 " [ " 是启动测试命令,“ [ “后和” ] "前都要有空格
test的返回结果只能是整数值,1(true),0(false)
-
使用test命令判断文件属性
- -e 是否存在 test -e test.txt
- -f 是否是文件
- -d 是否是目录文件
- -c 是否是字符设备文件
- -S 是否是Scoket文件
- -p 是否是管道文件
- -L 是否是链接文件
-
使用test命令判断文件权限
- -r 判断是否有读的权限 test -r test.txt
- -w 是否有写的权限
- -x 是否有可执行的权限
-
使用test命令对文件间的操作
- -nt 判断file1是否比file2新
- -ot …旧
- -ef 是否相同
-
测试字符串
- -n 测试字符串是否部位空
- -z 测试字符串是否为空
- = 测试字符串是否相同
- != 测试字符串是否不同
-
测试数值
-
equal ,greater,lesser
-
-eq 是否相等
-
-ge 大于等于
-
-gt 大于
-
-le 小于等于
-
-lt 小于
-
-ne 不等于
复合测试条件
-
! 非 !experssion
-
-a 且 experssion1 -a experssion2
-
-o 或 experssion1 -o experssion2
-
if分支结构
1.if-then结构
if expression
then
commands
fi
expression是一个逻辑表达式,可以用test表示,也可以用 [] 表示。
2.if-then-else结构
if expression
then
conmmands1
else
conmmands2
fi
3.嵌套结构
if expression1
then
if expression2
then
conmmands1
fi
conmmands2
fi
case多条件分支结构
case 变量 in
pattern1) commands1;;
pattern2|pattern3)conmmands2;;
*)commands3;;
esac
注意
1.在使用case结构时,在结尾处要添加esac作为case结构的结尾
2.在每一条执行语句后面需要添加两个分号作为分支结束的标志
select命令的使用
作用:引导用户做出选择
select 变量 in 变量列表
do
命令
done
#用户的选择会放入choose变量中
$choose
shell中的循环结构
for循环
1.for-in循环
for 变量 in 取值列表
do
conmmands;
done
注意
1.取值列表
1 2 3 4 5 6 7 8
spring summer autumn winter
2.C式 for 结构
for((expression1;expression2;expression3))
{
循环体;
}
expression1:用于变量的初始化
expression2:逻辑表达式,判断条件
expression3:循环变量的变化操作
while命令的使用
while test expression
do
conmmands
done
#例子
num=1
echo while 循环开始
while [ $num -le 6 ]
do
echo "the current num is $num"
let num++
done
echo while 循环结束
#使用until命令
until test expression
do
conmmands;
done;
循环控制符
- break:中断
- continue:继续
创建函数
脚本函数的基本用法
#函数的创建和使用
1.第一种方式
function name
{
conmmands;
}
2.第二种方式
name()
{
conmmands;
}
#函数的调用
函数名 [函数参数列表]
#函数的参数
由标准参数变量表示并且有命令行传递给函数的参数
$0(函数名) $1 $2 ...
$# 表示传递给函数参数的个数
#函数的返回值
1.要想获得命令的返回值,一般用 $?
2.默认情况下,函数的返回值式最后一条命令的返回值
3.return values;(values是函数的返回值,这个返回值必须在0~255之间)
4.var="function" #将函数function的执行结果返回给变量var
函数族红的全局变量和局部变量
#全局变量:在整个脚本执行的过程中都有效的变量
变量定义时默认为全局变量
#局部变量:local定义的变量只能在函数内使用
local valnum
数组与函数
1.数组示例
·定义
num1=(1,2,3,4,5)
num2=(a,b,c,d,e)
·使用
${array1[*]}
脚本函数递归与嵌套调用
处理数据输入
命令行参数
#例子
./add.sh 1 2
#格式
./相对路径下的脚本名称 命令行参数
./绝对路径下的脚本名称 命令行参数
$(basename $0)#将执行的shell脚本名称从其绝对路径中剥离出来
特殊参数变量
1.参数统计
$#
2.获取所有参数
$* #将所有参数当作一个单词处理
$@ #将参数看成是多个对象
特殊输入方式
移动变量
shift n #移动n个变量位置--作用可以获得$9之后的变量
#例子
./12-11.sh a b c d e f g h i j
$* a b c d e f g h i j
$1 a
shift 2
$* c d e f g h i j
$1 c
读取文件
cat 文件名 | while read lineInfo
do
conmmand;
done
#每次读取文件的一行并做处理
选项标准化
- -a 全部对象
- -d 针对目录对象
- -c 计数
- -f 针对文件做处理
- -h 帮助信息
- -r 递归操作
- -v 生成性详细信息输出
- -y 对所有问题回答yes
处理数据的输出
在执行每一个Shell命令行时通常会打开3个标准问价
- 标准输入文件(STDIN):通常对应终端的键盘,对应标准文件输入符0
- 标准输出文件(STDOUT):对应终端的屏幕,1
- 标准错误输出文件(STDERR):对应终端的屏幕,2
重定向
#I/O重定向
ls -l /home 1>home.txt
#格式
命名 > 文件名
#如果重定向的文件名不存在,会创建该文件
#当文件存在时,当前命令执行的结果会将文件中的原内容进行覆盖
#追加重定向
命令 >>文件名#当文件存在时,将命令的执行结果追加到内容之后,而不会覆盖
#永久重定向
exec 命令 > 文件名
#在脚本中重定向输入
命令 < 文件名
#例子
wc -l < data.txt #显示data.txt中的行数
#创建自己的重定向
#创建输入文件描述符
Linux系统一般可以打开9个文件描述符,而每个进程启动时,除了自动打开标准输入、标准输出、标准错误3个文件描述符之外,用户还可以创建属于自己的文件描述符
#例子
exec 3 > 13-6.log
echo '输入文字到13-6.log中' > &3
#创建输出文件描述符
#例子
exec 3 < &0
#关闭文件描述符
#将要关闭的文件描述符重定向到 &-
losf命令
查看进程打开的文件、目录,还可以查看进程监听的端口等socket相关的信息
tee
将记录同时发送到两个地方,一个是发送到文件,一个是发送到标准屏幕上。
date | tee 13-9.log#获取当前时间,并输出到13-9.log文件中,同时发送到标准屏幕上
grep命令
grep命令的主要作用是实现文本的检索。
grep [选项] [匹配样本] [文件列表]
用于在指定的文件列表中查找指定的匹配样本。
- 1)如果不指定文件名或“-”,那么grep指定会从标准输入设备读取数据进行匹配
- 2)选项:-c 只输出匹配行的计数
- -E 允许使用扩展模式匹配
- -i 不区分大小写
- -v 反向匹配,输出不匹配的行
- -n 显示匹配行和行号
- 类名的使用
- 国际匹配的类名
- [[:upper:]] [A-Z]
- [[:lower:]] [a-z]
- [[:digit:]] [0-9]
- [[:alnum:]] [0-9a-zA-Z]
- [[:space:]] 空格和TAB
- [[:alpha:]] [a-zA-Z]
egrep命令的使用
egrep [选项] [匹配模板] [查找文件列表]
- 匹配一个或多个字符 ‘a+[a-z]+[0-9]’
(|) 匹配任意字符串 (root|ubntu)
ps -ef 查看进程状态
脚本控制
Linux信号机制
捕捉信号
- trap “cmds” signals : 当shell接收到signals命令时,执行cmds命令
- trap -p signal : 打印当前信号的trap设置
进程的控制
后台运行符号 &:此时程序只是在该终端的后台运行,而没有真正的实现后台运行。如果终端关闭,该程序也会被关闭
nohup 命令 &:真正的实现了程序的后台运行。此时需要输入到屏幕上的标准输出会直接输出到文件名为nohup.out的文件中
例子:
- nohup ./20.3.sh &
- ./20-3.sh &
运行进程的控制
- jobs命令的主要作用时显示当前环境中的所有任务,配合不同的选项可以显示不同的任务信息
- -l 列出进程ID
- -n 只列出哪些自从上次用户修改状态后的进程信息
- -r 只列出状态时running的任务
- -s 只列出状态时stoped的任务
- fg:使得后台运行的命令调至前台来运行
- Ctrl +Z :暂停前台程序的运行 bg:继续执行暂停的命令
脚本运行的优先级
在Linux2.6中,实时进程的优先级范围为099,而普通进程的优先级范围时100139.数值越小,进程的优先级越高
- 可以通过 ps 命令来查看进程的优先级
- 字段PRI 是进程优先级,值越小,优先级别越高
使用nice指定优先级
nice值时进程优先级的修正值
PRI值=PRI值(旧值)+NICE值
- nice [-n <优先等级> ]
- renice [优先等级] [-p <程序识别码>] [-g <程序群组名称> ] [-u <用户名称>]