Linux学习笔记
用户管理及组
/etc/passwd #用户账号文件
/etc/shadow #用户影子文件
/etc/group #用户组账号文件
/etc/gshadow #用户组影子文件
/etc/spool/mail #用户邮箱目录
/etc/skel #用户模板目录
/etc/default/useradd
/etc/login.defs #用户默认配置
添加用户
useradd [选项] 用户名
选项:
-u 指定uid
-g 指定初始组(尽量不使用)
-G 指定附加组
-c 添加说明
-d 指定家目录
-s shell /bin/bash
删除用户
userdel [-r] 用户名
-r 删除用户同时删除该用户家目录
修改用户
usermod [选项] 用户名
选项:
-u UID:修改用户的UID
-d家目录:修改用户的家目录。家目录必须写绝对路径
-c用户说明:修改用户的说明信息,就是/etc/passwd文件的第五个字段
-g 组名:修改用户的初始组,就是/etc/passwd文件的第四个字段
-G 组名:修改用户的附加组,其实就是把用户加入其他用户组
-s shell:修改用户的登录Shell。默认是/bin/bash
-e 日期:修改用户的失效日期,格式为“YYYY-MM-DD”。也就是/etc/shadow文件的第八个字段
-L:”临时锁定用户(Lock)
-U:解锁用户(Unlock)
查询用户
id 用户名
修改密码
passwd [选项] 用户名
选项:
-l 暂时锁定用户(仅root使用)
-u 解锁用户(仅root使用)
注 : 不加用户名即给当前用户修改密码
切换用户
su [选项] 用户名
su -c "ls /home" 用户名
su - 用户名
选项:
- 用户环境变量一起切换
-c 仅执行一次命令,不切换身份
exit,logout注销退到上个用户
创建用户组
groupadd [选项] 组名
选项
-g 指定组id
删除用户组
groupdel [选项] 组名
把用户添加进组或从组中删除
gpasswd [选项] 组名
选项:
-a 用户名:把用户加入组
-d 用户名:把用户从组中删除
文件管理
在Linux系统上,一切皆文件,任何软件和I/O设备都被视为文件。Linux中文件名最大支持256个字符,可以分别用A-Z,a-z,0-9等字符来命名,与Windows不同,Linux中文件名是区分大小写的。Linux系统中的文件是否能被执行,与扩展名没有关系,主要看文件的属性
普通文件:最常使用的一类文件,用于存放数据、程序等信息的文件,如图形文件、声音文件、文档文件等,使用 ls -l 命令后,第一列第一个字符为“-”的文件为普通文件,普通文件一般为灰色字体,绿色字体的是可执行文件,红色字体的是压缩文件
目录文件:Linux内核组织文件系统的基本节点,存放文件名及其相关信息的文件,包含下一级目录或普通文件
设备文件:Linux将所有的外设都看作一种特殊的文件,用户通过文件访问设备,简化用户操作。根据访问数据方式的不同又分为块设备文件和字符设备文件。
链接文件:指向一个真实存在的文件,为解决文件的共享使用引入链接机制。顺带隐藏文件路径及节省存储等好处。链接分为硬链接和软链接。
管道文件:用于进程间传递数据的文件,主要作用是将前一个命令的标准输出作为后一个命令的标准输入,通常管道建立在调整缓存中。管道分为无名管道和有名管道,管道符“|”
主要命令
pwd #显示当前工作目录的路径(绝对路径)
cd #改变当前工作目录
rmdir [-p] #删除目录 -p 递归删除目录,当子目录删除后其父目录为空时,也一同被删除
touch 文件 #创建文件
cat [选项] 文件名 #只读显示查看文件内容 -b 显示行号,空白不显示 -n 显示行号,包括空白行
more [选项] 文件名 #分页查看文件 -c 显示下一屏之前先清屏 -d 每屏底部显示“—more--(xx%)”等友好提示信息 -s 文件中的连续空白行压缩诚一个空白行显示 空格下一页 b上一页
less [选项] 文件名 #选项与more类似 按空格键向下翻动一页,上/下方向键向上/下回翻,按q键则退出查看
> #输出重定向:会将原来的文件的内容覆盖
>> #追加:不会覆盖原来文件的内容,而是追加到文件的尾部
cal [-y] #显示当月日历 -y 当前年日历
echo #输出
Locate 搜索文件 #由于locate指令基于数据库进行查询,所以第一次运行前,必须使用 updatedb指令创建 locate数据库
#管道符’|',表示将前一个命令的处理结果输出传递给后面的命令处理 手册文档 man
ls [选项] [文件/目录] #列出目录内容
选项 | 描述 |
---|---|
-a | 显示目录下的所有文件信息,包含以.开头的隐含文件 |
-A | 显示目录下的所有文件信息,包含以.开头的隐含文件,但不列出”.”和”..” |
-d | 显示目录本身的信息,而非目录下的文件信息 |
-l | 长格式显示详细信息,该选项最常用 |
-h | 人性化显示容量信息 |
-t | 以修改时间排序,默认按文件名称排序 |
-c | 显示文件或目录属性最后修改时间 |
-u | 显示文件或目录最后被访问的时间 |
mkdir [选项] 目录名称
选项 | 描述 |
---|---|
-m | 设定目录权限,类似chmod |
-p | 创建多级目录 |
-v | 每次创建新目录都显示信息 |
rm [选项] 文件/目录
选项 | 描述 |
---|---|
-i | 进行交互式删除,删除时提示用户输入“y”确认 |
-f | 强制删除,不给出相应提示 |
-r | 递归地删除整个目录 |
cp [选项] 源文件/目录 目标文件/目录
选项 | 描述 |
---|---|
-a | 递归地将源文件或目录中的内容都复制到目标目录,并保留文件属性及链接不变 |
-d | 复制时保留文件链接 |
-f | 强制复制,在覆盖已经存在的目标文件时,不给出提示(系统默认设置) |
-i | 交互式复制,在覆盖目标文件 |
-p | 除复制源文件内容外,还复制修改时间和访问权限 |
-r | 若源文件是个目录,则递归将目录中的文件复制倒目标目录,此时目标必须是个目录 |
mv [选项] 源文件/目录 目标文件/目录
选项 | 描述 |
---|---|
-i | 交互式操作,若目标文件或目录有与源文件或目录同名的,则要求确认 |
-f | 强制操作,若目标文件或目录与源文件或目录同名,则直接覆盖现有的文件或目录 |
date #显示当前日期
date -s "" #设置日期
date "+%Y-%m-%d:%H:%M:%S"
find [路径] [选项]
选项 | 描述 |
---|---|
-name | 查找文件名匹配所给字串的所有文件,字串内可用通配符 |
-type | 按文件类型查找,文件(f)、目录(d)、设备(b,c)、链接(l)等 |
-user | 按文件属主查找 |
-exec | 对找到的文件执行命令,后接Linux命令 |
-a | 逻辑与 |
-o | 逻辑或 |
! | 逻辑非 |
grep [选项] 匹配模式 文件名
grep -ni yes /temp/a.txt 过滤出包含yes的行
选项 | 描述 |
---|---|
-i | 忽略字符大小写 |
-v | 取反匹配,显示不包含匹配文本的所有行 |
-w | 匹配单词 |
--color | 显示颜色 |
文件或目录权限
访问权限
文件访问者:用户(u)、组(g)、其他(o)
访问权限:只读(r=4)、写(w=2)、执行(x=1)
-rwxrwxrwx 类型用户组其他
字符 | 文件类型 |
---|---|
- | 普通文件 |
d | 目录文件 |
l | 链接文件 |
b | 块设备文件 |
c | 字符设备文件 |
p | 管道文件 |
s | 套接字文件 |
修改权限
修改权限 chmod
chmod [选项] [模式] 目录文件名称
-
+、-、= 变更权限
u:所有者 g:所有组 o:其他人 a:所有人(u、g、o的总和)
chmod u=rwx,g=rx,o=rx abc
chmod u-x,g+w abc
-
通过数字变更
chmod 755 abc.txt
更改文件或目录所有权 chown
chown [选项] 用户名 文件或目录
-R #如果是目录则使其下所有子文件或目录递归生效,即一次修改某个目录下所有文件的所有者
chown newowner file 改变文件的所有者
chown newowner:newgroup file 改变用户的所有者和所有组
修改文件或目录所在组 chgrp
chgrp newgroup file
-R #如果是目录则使其下所有子文件或目录递归生效,即一次修改某个目录下所有文件的所有者
文件默认权限 umask掩码
用八进制数显示umask权限:umask
更改umask umask 027
文件创建时的默认权限=0666-umask
目录创建时的默认权限=0777-umask
单纯计算不准确 可以通过字母符号计算
文件特殊权限SUID、SGID、Dticky BIT
SUID 4 命令执行者要拥有执行权限 在执行该程序是获取程序所属主的身份 执行过程中有效 如passwd,
SGID 2 只有可执行的二进制程序才可设置 类似SUIFD不同的是 还要拥有读权限 组升级为程序所属组的身份
SBIT 1 仅对目录有效 普通用户对目录拥有wx权限 即有写入权限 除root用户也可以删改其他用户的文件所以需要BIT粘着位 限制对该目录有写权限的只能删改自己建立的文件
例:chmod 4755 abc.txt
文件打包及压缩
zip/unzip zip用于压缩 unzip解压 .zip
zip [选项] 压缩包名 源文件和源目录 #-r 递归压缩
unzip [选项] 压缩包名 # -d 指定解压文件存放目录
gzip/ungzip gzip压缩后不保留原来文件 .gz 只能逐个生成压缩文件无法打包目录和将多个文件打包成一个文件所以经常和tar一起使用
bzip2/unbzip2 .bz2
bzip2 [选项] 源文件
-d #解压缩
-k #压缩保留源文件
-v #显示压缩详细信息
tar打包 非压缩命令,通常保存文件先用tar将目录或文件打成tar归档文件,再用gzip或bzip2压缩,最后打包后的文件是 tar.gz结尾的文件
tar [选项] 打包的内容
-c :打包
-x :解打包
-f :指定压缩包的文件名
-v :显示解打包文件过程
-t :测试,就是不解打包,只是查看包中有哪些文件
-C 目录:指定解打包的位置
tar打包压缩 .tar.gz/.tar.bz2
-z:压缩和解压缩".tar.gz"格式
-j:压缩和解压缩”.tar.bz2"格式
磁盘管理
磁盘分区类型
- 主分区:分区信息存储在主引导记录扇区的分区表中,叫主分区,也叫引导分区,一般操作系统安装在这个分区中,这样才能保证开机自动进入系统,一块硬盘,创建至少1个、最多4个主分区,当创建完4个主分区后,就无法再创建扩展分区和逻辑分区了。
- 扩展分区: 扩展分区是一个概念,实际在硬盘中是看不到的,也无法直接使用扩展分区,除了主分区外,剩余的磁盘空间就是扩展分区了。一块硬盘,没有或者最多1个扩展分区。扩展分区可以继续进行扩展切割分为若干逻辑分区
- 逻辑分区:在扩展分区上面,可以创建多个逻辑分区。每一个逻辑分区都可以存储一个文件系统。
磁盘分区文件命名规则: /dev/**
Linux给IDE磁盘分配了一个由hd前缀组成的文件,SCSI磁盘则被分配由sd前缀组成的文件,USB接口的移动磁盘通常会被识别为SCSI,因此也是以sd开头
lsblk -f 查看当前系统分区情况
常用磁盘管理命令
mount [选项] 设备名 挂载点 #用于挂载指定的文件系统
-a 安装在/etc/fstab文件中列出的所有文件系统(自动挂载) -r 将文件系统安装为只读。
-w 将文件系统安装为可写,为命令默认情况。
-t 指定设备的文件系统类型
#挂载点必须是一个已经存在的目录,这个目录可以不为空,但挂载后,这个目录下以前的内容将不可用,umount以后会恢复正常
umount [device]/[dir]
-a:卸载/etc/mtab中记录的所有文件系统
-h:显示帮助信息并退出
-r:若无法成功卸载,则尝试以只读的方式重新挂入文件系统
-v:执行时显示详细的信息
-V:显示版本信息
fdisk #能划分磁盘成为若干个区,同时也能为每个分区指定分区的文件系统
fdisk –l #列出所有的分区,包括没有挂上的分区和usb设备
fdisk -l /dev/hda1 #查看单个硬盘情况
fdisk 设备:fdisk 命令操作磁盘
mkfs #分区格式化
mkfs [选项] 设备
-t:定义创建的文件系统类型,默认为Ext2
-c:在创建文件系统前检查设备坏块
#例 mkfs –t ext4 /dev/sda1
du [选项] 文件/目录 #统计文件和目录占用磁盘空间情况
-h: 输出文件系统分区使用的情况,例如:10KB,10MB,10GB等
-s: 显示文件或整个目录的大小,默认单位是KB
-c: 在显示结果后面添加一个总计(系统默认设置)
-a: 显示所有文件及其子目录占用的数据块数
df [选项] #磁盘空间统计
-a: 显示所有文件系统的信息,包括swap和/proc
-h: 以最适合的容量单位显示
-i: 显示文件节点数inode的使用情况而不是文件块的使用情况
-l: 只显示本地系统的使用情况
虚拟机添加硬盘
添加硬盘(虚拟机->设置->硬盘->默认)
lsblk -f #显示磁盘信息
fdisk /dev/sdb #对磁盘进行分区
-m #提示
-w #保存修改
mkfs -t ext4 /dev/sdb1 #格式化
mkdir -m 777 /mnt/newdisk
mount /dev/sdb1 /mnt/newdisk #临时生效
vim /etc/fstab #写入到该文件永久生效
/dev/sdbl /mnt/newdisk1 ext4 0 0
mount -a #/etc/fstab立即生效
删除永久生效
vim /etc/fstab #删除配置的行:wq
df -h 查看挂载信息 #umount
fdisk
-d #删除对应分区 -w
lsblk -f#查看是否成功
虚拟机软件移除硬盘
磁盘配额管理
soft:软限制,也称为最低容量限制。使用者在宽限时间之内,他的容量可以超过最低容量限制,但必须在宽限时间之内将磁盘容量降低到最低容量的限制之下
hard:硬限制,也称为最高容量限制,是绝对不能超过的容量,最高容量限制要比最低容量限制大
宽限容量:soft到hard之间的容量就是宽限容量
宽限时间:当使用者使用的空间超过了软限制,却还没有到达硬限制时,那么在这个宽限时间之内就必须请使用者将使用的磁盘容量降低到软限制之下,而当时用者的磁盘容量使用情况超过软限制时,宽限时间就会自动被启动,而在使用者将容量降低到软限制之下后,宽限时间就会自动的取消
quota [-uvsl] [username]
quota [-gvsl] [groupname]#查看磁盘空间使用情况
-u:后面可以接 username,表示列出该用户的磁盘配额限制值;如果不接用用名,表示显示出执行者的磁盘配额限制值
-g:后面可接groupname,表示显示出该群组的磁盘配置限制值
-v:显示每个 filesystem的磁盘配额值
-s:可选择以inode或磁盘容量的限制值来显示
-1:仅显示出目前本机上面的 filesystem的磁盘配额值
quotacheck [-avug][/mount_ point]#创建磁盘配额文件
-a:扫瞄所有在/etc/mtab内含有磁盘配额支持的filesystem,加上此参数后, /mount_point可不必写,因为它会扫描所有的文件系统
-u:针对使用者扫描档案与目录的使用情况,会建立aquota. user
-g:针对群组扫描档案与目录的使用情况,会建立aquota. group
-V:显示扫描过程的信息;
-M:强制进行quotacheck的扫描
edquota [-u username] [-g groupname] #对用户或者用户组设置磁盘配额
edquota -t #修改限制时间
edquota -p username_demo -u username #复制配额
-u:后接账号名称。可以进入磁盘配额的编辑画面去设定username的限制值;
-g:后接群组名称。可以进入磁盘配额的编辑画面去设定groupname的限制值;
-t: 可以修改宽限时间(就是超过磁盘配额的 soft limit值后,还能使用硬盘的宽限期限)
-p:复制范本。 username_demo为已经存在并且已设定好磁盘配额的使用者,那么将 username_demo这个人的磁盘配额限制值复制给 Username
quotaon [-avug] [/mount_ point] #启动磁盘配额
-u:针对使用者启动磁盘配额(aquota.user)
-g:针对群组启动磁盘配额(aquota.group)
-v:显示启动过程的相关讯息;
-a:根据/etc/mtab内的文件系统设定启动有关的磁盘配额,若不加-a的话,则后面就需要加上特定的分区名
quotaoff [-avug] [/mount _point] #关闭磁盘配额
-a:依据/etc/mtab文件关闭配额分区
-u:关闭用户的磁盘空间限制
-g:关闭群组的磁盘空间限制
-v:显示指令执行过程
repquota [-avug] [文件系统…]
-a:直接到/etc/mtab搜寻具有磁盘配额标志的文件系统,并报告磁盘配额的结果;
-v:输出所有的磁盘配额结果;而非仅下达指令者自己的磁盘配额限值;
-u:显示出使用者的磁盘配额限值(这是默认值);
-g:显示出个别群组的磁盘配额限值
执行repquota指令,可报告磁盘空间限制的状况,清楚得知每位用户或每个群组已使用多少空间
配额步骤
1)设定分区的文件系统支持磁盘配额参数:由于磁盘配额必须要让文件系统支持才行,而支持度最好的文件系统是ext2/ext3,所以磁盘配额的文件系统最好设置为ext2/ext3,启动文件系统支持磁盘,最简单的就是编辑/etc/fstab,使得准备要开放的磁盘可以支持磁盘配额。(添加参数)defaults,usrquota,grpquota
2)建立磁盘配额记录文件:整个磁盘配额进行磁盘限制值记录的档案是 aquota. user/aguota.group,这两个文件必须利用 quotacheck扫描才行,所以,接下来的步骤就是用 quotacheck来扫描。quotacheck -avgu
3)编辑磁盘配额限制值数据:使用 edquota来编辑每个使用者或群组的可使用空间 edquota -u username/edquota -g groupname
4)重新扫描与启动磁盘配额:设定好了磁盘配额之后,建议再进行一次quotacheck,然后再以quotaon来启动(关闭 磁盘配额用quotaoff )
软件包管理
RPM包
rpm -ivh 包全名
-i #install安装( install)
-v #显示更详细的信息( verbose)
-h #打印显示安装进度
-U #升级安装,如果没有安装过,系统直接安装。如果安装过的版本较旧,则升级到新版本
-F:#升级安装,如果没有安装过,则不会安装。必须安装有较旧版本,才能升级
-e #卸载
--nodeps #不检测依赖性安装
--replacefiles #替换文件安装
--replacepkgs #替换软件包安装
--force #强制安装
--test #测试安装
--prefix #指定安装路径(不建议)
rpm -q 包名
-q #(查询)query
-a #所有已安装
-i #查看某软件包信息
-p #查询没有安装的软件包(package)
-l #列出软件包的文件列表和打算安装位置
-f #查询文件属于哪个软件包(file) rpm -qf 文件名
Vim基本操作
hjkl #左下上右
a/A #在光标所在字符后插入/在光标所在行尾
i/I #在光标前插入/在光标所在行首插入
o/O #在光标下插入新行/上插入新行
^ #移到行首
$ #移到行尾
gg #移动到文件头
G #移动到文件的最后一行的行头
:n #移动到第几n行
x #删除单个字母
nx #删除n个字母
dd #删除单行
ndd #删除多行
:n1,n2d #删除指定范围的行 (10,20d,删除10到20行)
p #粘贴到光标后
P #粘贴到光标前
dG #从光标所在行删除到文件尾
yy #复制单行
nyy #复制n行
u #撤销
ctrl+r #反撤销
r R #r:替换光标所在处字符 R:从光标处开始替换
/查找内容
?查找内容 #n:下一个 N:上一个
:1,10s/old/new/g #替换1到10行中所有的old为new
:%s/old/new/g #替换文件中的old为new
:r 文件名 #把文件内容导入光标位置
:! 命令 #vim中执行系统命令
:r !命令 #在vim中执行系统命令,并把命令结果导入光标所在行
:ab 源字符 替换后字符 #字符替换
vim -o 文件1 文件2 #多文件打开
-o(小写o) 会上下分屏打开两个文件,通过先按“ctrl+w”,再按“上下箭头”的方式在两个文件之间切换
-0(大写0) 会左右分屏打开两个文件,通过先按“ctr1+w”,再按“左右箭头”的方式在两个文件之间切换
:set nu/nonu #显示与取消行号
:syntax on/off #语法高亮
:set hlsearch/nohlsearch #查找字符串高亮显示
:set ruler/noruler #显示右下角的状态栏
:set showmode/noshowmode #显示左下角
:set list/nolist #是否显示隐藏字符
shell编程
shell基础
常用快捷键
ctrl+A #把光标移动到命令行开头
ctrl+E #把光标移动到命令行结尾
ctrl+C #强制终止当前命令
ctrl+L #清理屏幕
ctrl+U #剪切或删除光标之前的命令
ctrl+K #剪切或删除光标之后的命令
ctrl+Y #粘贴剪切的内容
ctrl+R #在历史命令中搜索界面
ctrl+D #退出当前终端
ctrl+Z #暂停并放入后台
ctrl+S #暂停屏幕输出
ctrl+Q #恢复屏幕输出
cat /etc/shells #查看当前系统支持的shell
tcsh --version #查看当前shell的版本号
./A.sh #相对路径执行
/root/sh/A.sh #绝对路径执行
sh A.sh #sh 脚本名 参数
echo [选项] [输出内容]
-e #支持反斜线控制的字符转换
-n #取消输出后文末的换行符号(即默认是换行的)
历史命令
history [选项] [历史命令保存文件]
命令 | 功能描述 |
---|---|
history | 显示全部历史命令记录 |
history n | n 为数字,显示之前执行过的n条命令 |
history –c | 清空所有的历史命令 |
history –w | 将历史命令记录写入列表中(用户目录下的.bash_history文件) |
!n #重复执行历史上的第n条命令
!! #重复执行上一条命令
!字符串 #重复执行最后一条以该字串凯开头的命令
!$ #重复上一条命令的最后一个参数
起别名
alias #查询命令别名
alias 别名=原命令 #设定命令别名
ubalias vi #取消别名
第一顺位执行用绝对路径或相对路径执行的命令
第二顺位执行别名
第三顺位执行Bash的内部命令
第四顺位执行按照$PATH环境变量定义的目录查找顺序找到的第一个命令
为了让这个别名永久生效,可以把别名写入环境变量配置文件“~/. bashrc
wc [选项] [文件名称]
-c #统计字节数
-w #统计单词数
-l #统计行数
多命令执行
分号:ls ;dsad;dasd;ll 顺序执行
逻辑与:ls && date lssa && date #&&前true继续执行&&后命令
逻辑或:ls ||date lssdas || date #||前为false才执行后面
变量
变量: 变量名称可以由字母、数字和下划线组成,但是不能以数字开头,变量的默认类型都是字符串型,如果要进行数值运算,则必须指定变量类型为数值型
变量用等号连接值,等号左右两侧不能有空格
用户自定义变量、环境变量、位置参数变量、预定义变量
set [选项]
-u #调用未声明变量会报错
-x #在命令执行之前会把命令先输出一次
set 变量名 #变量的查看
unset 变量名 #删除变量
export 变量名 #设置环境变量 使用大写字母
env #在终端查看环境变量
export #在终端显示环境变量列表
位置参数变量
$n #n为数字 0代表命令本身 1-9代表第一个到第九个参数 10以上要{} ${11}
$* #变量代表命令行的所有的参数,一个整体
$@ #变量代表命令行的所有的参数,每个参数分别对待
$# #所有参数的个数
$ 和 $@区别:$** for循环1次 *@ for循环参数个数次
预定义变量
$? #最后一次执行的命令的返回状态,为0证明上一个命令正确,非0则不正确
$$ #当前进程的pid
$! #后台运行的最后一个进程的pid
数组,就是相同数据类型的元素按一定顺序排列的集合,就是把有限个类型相同的变量用一个名字命名,然后用编号区分他们的变量的集合,这个名字称为数组名,编号称为下标。组成数组的各个变量成为数组的分量,也称为数组的元素,有时也称为下标变量
${name} #输出数组第一个元素
${name[0]}
${name[*]} #输出数组所有元素
接收键盘输入
read [选项] [变量名]
-p #提示信息 等待read输入时,输出提示信息
-t #秒数 read命令会一直等待用户输入,使用该选项可以指定等待时间
-n #字符数 read只接收指定的字符数就会执行
-s #隐藏输入的数据
变量名如果不指定会把输入保存入默认变量REPLY,如果只提供了一个变量名,则整个输入行赋予该变量,如果提供了一个以上的变量名,则输入行分为若干个字,一个接一个地赋予各个变量,而命令行上的最后一个变量取得剩余的所有字
运算符
declare [+/-] [选项] 变量名
-:#给变量设定类型属性
+:#取消变量的类型属性
a:#将变量声明为数组型
i:#将变量声明为整数型( integer)
r:将变量声明为只读变量。注意,一旦设置为只读变量,既不能修改变量的值,也不能删除变量,甚至不能通过+r取消只读属性
x:将变量声明为环境变量
p:显示指定变量的被声明的类型
#使用expr或let数值运算$( expr 运算式 )
$( expr $1 + $2 )//+-*/ 除法为/*
# !!使用expr +左右必须要有空格
#$(( 运算式 )) $[ 运算式 ]
通配符
#可以在一个命令中用一个通配符来替代一系列字符或字符串
? #匹配任意一个字符
* #匹配0个或任意多个字符
[] #匹配括号内的任意一个字符
[-] #-表示范围 匹配括号内的任意一个字符
[^] #逻辑非 匹配不是括号内的一个字符 例 [^0-9]
其他特殊符号
'' #单引号内的所有特殊符号如$ ` 都原样输出
"" #双引号内的所有特殊符号都原样输出 除 $ ` \
`` #反引号内的为系统命令和$()一样
$() #如上
# 注释
$ #调用变量的值
\ #转义字符
脚本编写
条件判断
判断的命令和方式
test 条件表达式
[ 条件表达式 ] 注意条件表达式两边有空格
[[ 条件表达式 ]] 支持正则表达式
1.文件属性相关判断
-e 文件(包括目录)是否存在
-d 是否是目录
-f 是否是普通文件
-L 是否是链接文件
-S 是否是socket文件
-p 是否是管道文件
-s 文件大小是否存在并且为非空文件,无法判断非空目录;注意存在且非空才返回true
2.文件权限相关的判断
-r 当前用户是否可读
-w 当前用户是否可写
-x 当前用户是否可执行
-u 是否有suid(权限9位的前3位里是否有s位)
-g 是否sgid(权限9位的中间3位里是否有s位)
-k 是否有t位(权限9位的后3位里是否有t位)
3.文件新旧比较
file1 -nt file2 file1是否比file2新
file1 -ot file2 file1是否比file2旧
file -ef file2 file1是否和file2指向同一个inode
4.数字的比较
-eq 等于
-ne 不等于
-gt 大于
-lt 小于
-ge 大于等于
-le 小于等于
5.字符串相关的判断
-z 字符串是否为空
-n 字符串是否不为空
str1 = str2 是否相等
str1 != str2 是否不相等
6..逻辑判断
-a 且,和 表示连个条件同时满足
-o 或,两个条件满足一个即可
! 取反
流程控制
单分支if
#基本语法
if [ 条件表达式 ]
then 命令1
fi
#或
if [ 条件表达式 ] ; then
命令1
fi
♦ if语句使用fi结尾,和一般语言使用大括号结尾不同
♦ [条件判断式] 使用test命令判断,所以中括号和条件判断式之间必须有空格
♦ then后面跟符合条件之后执行的程序,可以放在[ ]之后,用“;”分割。也可以换行写入,就不需要“;”了
双分支if
if [ 条件表达式 ]
then 命令1(条件成立时,执行的程序)
else 命令2(条件不成立时,执行的程序)
fi
多分支if
if [ 条件表达式1 ]; then 命令1(条件成立时,执行的程序)
elif [ 条件表达式2 ]; then 命令2(条件成立时,执行的程序)
elif [ 条件表达式3 ]; then 命令3(条件成立时,执行的程序)
…
else 命令n(当所有条件都不成立时,最后执行此程序)
fi
for循环
for 变量名 in 列表
do
程序(命令1;命令二等)
done
这种语法中for循环的次数,取决于in****后面值的个数(空格分隔),有几个值就循环几次,并且每次循环都把值赋予变量。假设in后面有三个值,for会循环三次,第一次循环会把值1赋予变量,第二次循环会把值2赋予变量。当for语句省略后面的in关键字时,将接受输入命令时的参数**作为循环变量
for((初始值;循环控制条件;变量变化))
do
程序(命令1;命令2等)
done
while循环
while [ 条件判断式 ] #判断式为真循环
do
程序
done
until循环
until [ 条件判断式 ] #判断式为假循环
do
程序
done
break和continue
◆Break和continue命令用于中断循环体的顺序执行。
◆ break命令:将控制转移到done后面的命令,因此循环提前结束。
格式为: break [n]
◆ continue命令:将控制转移到done,接着再次计算条件的值,以决定是否继续循环。
格式为:continue [n]
◆ n: 表示要跳出几层循环,默认值是1,表示只跳出一层循环。
case语句
case string1 in
str1)
commands-list1;;
str2)
commands-list2;;
...
strn)
commands-listn;;
esac
函数function
function 函数名 (){
程序
}
# $函数名 调用
进程管理
系统进程:是操作系统启动后,系统环境平台运行所加载的进程,它不与终端或用户关联
用户进程:与终端相关联,使用一个用户ID,是由用户所执行的进程
守护进程:没有屏幕提示,只是在后台等待请求,网络多用户系统工作绝大多数是通过守护进程实现的
进程和程序区别
1)进程是程序在一个数据集合上的运行过程。它是系统进行资源分配和调度的一个独立单位
2)程序是永存的;进程是暂时的,是程序在数据集上的一次执行,有创建有撤销,存在是暂时的
3)程序是静态的观念,进程是动态的观念
4)进程具有并发性,而程序没有
5)进程是竞争计算机资源的基本单位,程序不是
6)进程和程序不是一一对应的: 一个程序可对应多个进程即多个进程可执行同一程序; 一个进程可以执行一个或几个程序
进程管理作用
1)判断服务器健康状态
2)查看系统中所有进程
3)杀死进程
进程控制命令
ps [选项]
-a #显示所有用户进程
-f #显示进程详细信息
-e #显示包括系统进程的所有进程
-x #显示没有控制终端的进程
-l #显示进程的详细列表
-u #显示用户名和启动时间等信息
#常用命令
ps -ef #查看子进程和父进程关系
ps aux #查看进程状态
#USER:该进程是由哪个用户产生的
#PID:进程的ID号
#%CPU:该进程占用CPU资源的百分比,占用越高,进程越耗费资源
#%MEM:该进程占用物理内存的百分比,占用越高,进程越耗费资源
#VSZ:该进程占用虚拟内存的大小,单位.KB
#RSS :该进程占用实际物理内存的大小,单位KB
#TTY :该进程是在哪个终端中运行的
#STAT:进程状态
#START :该进程的启动时间
#TIME :该进程占用CPU的运算时间,注意不是系统时间
#COMMAND :产生此进程的命令名
#C:该进程的CPU使用率
进程状态
D :不可被唤醒的睡眠状态
R :该进程正在运行
S :该进程在睡眠状态,可被唤醒
T :停止状态,可能是在后台暂停或进程在除错状态
Z :僵尸进程。进程已经终止,但是部分程序还在内存当中
top [选项] #实时显示系统的进程状态
-d #秒数:指定top命令每隔几秒更新。默认是3秒
-b ##使用批处理模式输出。一般和“-n”选项合用,用于把 top命令重定向到文件中
-n #次数:指定top命令执行的次数。一般和“-b”选项合用
-p #指定PID,只查看某个PID的进程
#常用命令
top –p 18475 # 只查看pid为18475的进程
top –b -n 1 > /tmp/top.log # top命令执行一次,然后把结果保存到top.log文件
在top命令的交互模式当中可以执行的命令
?或h:显示交互模式的帮助
P:以CPU使用时间的多少进行排序,默认就是此项
M :以内存的使用率排序
N :以PID排序
T:按照CPU的累积运算时间排序
K:按照PID号,给予某个进程一个信号
U:监视指定用户
q:退出top
Top命令解释
1、任务队列信息
2、进程信息
3、CPU信息
4、物理内存信息
5、交换分区(swap)信息
pstree [选项] 以树形式显示
-u #显示进程所属用户
-p #显示进程pid
sleep time ;command #进程延迟一段时间再执行 time为延迟时间。单位为s,command 为命令
kill [选项] pid #杀死进程
-9 #强制杀死
前后台进程
◆ 前台是指当前可以操控和执行命令的操作环境,后台是指工作可以自行运行,但是不能直接用ctrl+c来终止它,只能使用fg/bg来调用工作
◆ 当前的登录终端,只能管理当前终端的工作,而不能管理其他登录终端的工作
◆ 放入后台的命令必须可以持续运行一段时间,这样才能捕捉和操作这个工作
◆ 放入后台执行的命令不能和前台用户有交互或需要前台输入,否则放入后台只能暂停,而不能执行
命令放入后台方式
在命令后面加入“空格****&”,这种方法放入后台的命令,在后台是执行状态
在命令执行过程中按ctrl+z快捷键,命令在后台是暂停状态
jobs [选项] #查看挂起到后台的进程
-l #显示工作的pid
fg 后台进程编号#后台挂起的命令恢复到前台执行
bg 后台进程编号#后台挂起的进程恢复到后台执行
定时任务
at作业
◆ at 一次性执行定时任务
◆ at服务管理:at命令要想正确执行,需要 atd服务的支持。atd服务是独立的服
开启服务:service atd start | systemctl start atd
设置开机自启:chkconfig atd on | systemctl enable atd
◆ at访问控制:即允许哪些用户使用at命令设定定时任务,或者不允许哪些用户使用at命令,主要依靠/etc/at.allow文件和/etc/at.deny文件来实现
at [选项] 时间 #ctrl+d发送
atq #查询当前服务器上的at工作
atrm 工作号 #删除指定的at任务
-m #当at工作完成后,无论命令是否有输出都用email通知执行at命令的用户
-c 工作号#显示该at工作的实际内容
#时间格式
# HH:MM
# HH:MM YYYY-MM-DD
# HH:MM[am|pm] [month] [date]
# HH:MM[am|pm] + [minutes|hours|days|weeks] //+在指定时间再加多久执行
cron作业
◆ 利用多个at命令虽然可以创建多个作业,但它只是指定某一个固定时间去执行,要想实现以固定的间隔时间执行作业,并且能统一管理所有作业, at命令就不能胜任了,可以利用强大的crontab命令来实现 cron作业
◆ cron是一个守护进程,是一个标准的后台服务程序。使用cron作业必须运行crond 服务。
◆ crontab命令和at命令类似,也是通过/etc/cron. allow和/etc/cron.deny文件来限制某些用户是否可以使用crontab命令,限制原则类似
◆ 用户的crontab设置
每个用户都可以实现自己的crontab定时任务,只要是使用这个用户身份执行“crontab -e”命令即可,这个用户不能加入/etc/cron.deny文件中。
crontab命令格式如下:
crontab [选项]
-e #编辑crontab定时任务
-l #查询crontab任务
-r #删除当前用户的所有crontab任务,-e删除一个
-u 用户名 #修改或删除其他用户crntab 仅root可用
Crontab定时任务注意事项:
1)六个选项都不能为空,必须填写。如果不确定使用“*”代表任意时间;
2)crontab定时任务,最小有效时间是分钟,最大时间范围是月。
3)在定义时间时,日期和星期最好不要在一条定时任务中出现,因为它们都是以天作为单位,容易让管理员混乱;
4)在定时任务中,不管是直接写命令,还是在脚本中写命令,最好都是用绝对路径。有时相对路径的命令会报错
cat /etc/crontab
SHELL=/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=root
HOME=/
# For details see man 4 crontabs
# Example of job definition:
# .---------------- minute (0 - 59)
# | .------------- hour (0 - 23)
# | | .---------- day of month (1 - 31)
# | | | .------- month (1 - 12) OR jan,feb,mar,apr ...
# | | | | .---- day of week (0 - 6) (Sunday=0 or 7) OR sun,mon,tue,wed,thu,fri,sat
# | | | | |
# * * * * * user-name command to be executed
前四行是用来配置crond任务运行的环境变量,第一行SHELL变量指定了系统要使用哪个shell,这里是bash;第二行PATH变量指定了系统执行[命令]的路径;第三行MAILTO变量指定了crond的任务执行信息将通过电子邮件发送给root用户,如果MAILTO变量的值为空,则表示不发送任务执行信息给用户;第四行的HOME变量指定了在执行命令或者[脚本]时使用的主目录。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通