Shell脚本基础知识备忘录

作者: 乘风御上者 分类: 综合 发布时间: 2019-11-03 18:11

PHPer在工作中配置LNMP环境,免不了和Linux系统打交道。要想php技术更近一步,了解系统及底层是必须的。但工作中不经常使用太容易忘记,因此把笔记贴出来,时常温习。

if语句中 0 代表真
与Linux哲学有关<没有消息是最好的消息> 除了0之外的数字都代表一种错误
条件测试: 数值比较
-eq(等于) -gt(大于) -lt(小于) -ge(大于等于) -le(小于等于)
以上条件测试必须在[ ]、[[ ]]、test 这三个符号中使用。
文件测试: 以下条件测试也必须使用三个符号
-e FILE: 测试文件是否存在
-f FILE: 测试文件是否为普通文件
-d FILE: 测试指定路径是否为目录
-r、-w、-x: 测试文件是否可读、可写、可执行
在if语句中只有以上条件判断时使用三个符号。
做数学运算:
$[]: C=$[$A+$B]
$(()): C=$(($A+$B))
let: let C=$A+$B
expr: C=expr $A + $B 相当于命令执行结果返回给C,各个运算符之间必须有空格
字符测试: 运算符两侧一定要有空格已经必须在[]中
==、!=、<、>: 日常使用逻辑运算符,前后空格
-n string: 判断制定字符串是否为空
-z string: 判断指定的字符串是否不为空
组合测试:
-a: 逻辑与
-o: 逻辑或
!: 逻辑非
定义变量: set varname=value (可省略set)
撤销变量: unset varname (定义和撤销都不能加$)
变量特征:
变量使用的时候必须加$,而在赋值的时候不能加$
${}: 在字符串中引用变量的时候使用。echo "this is ${NAME}s"
$1、$2、$3…: 参数位置变量
shift [N]: 可以将脚本的参数从第一个开始轮换掉,默认轮换一个。
$?: 上一个命令的执行状态返回值
变量的类型
本地变量(局部变量): 作用域为当前代码段
local VARNAME=VALUE
环境变量: 作用域为当前shell以及子进程
export VARNAME=VALUE
环境变量的查看: 默认查看当前shell的环境变量
printenv
env
export
特殊变量:
$1、$2、$3…: 参数位置变量
$?: 上一个命令的执行状态返回值
$=: 脚本的参数个数
$: 脚本的参数列表 $@: 脚本的参数列表(与$稍微不同)
I/O重定向: 输入输出重定向
>: 覆盖输出到指定位置
>>: 追加输出到指定位置
2>: 错误覆盖输出
2>>: 错误追加输出
&>: 正确或错误共同指定输出位置
bash: 检验脚本文件的语法错误
-x: 显示脚本运行的每一步
seq: 数值展开
另一用法{起始数..尾数}{1..10}
seq 10: 表示默认从1-10
seq 1 10: 表示从1-10
seq 1 2 10: 表示从1-10,每次步长2
declare: 变量类型声明
-i: 整型。相当于let
-x: 环境变量。相当于export
vim +行号 文件路径: 只用加号则打开文件到最后一行
vim +/pattern 路径: 打开文件并定位到第一次匹配到的地方
转换到编辑模式时:
i: 在光标所在字符前面转为输入模式
a: 在光标所在字符后面转为输入模式
o: 在光标所在行的下方新建一行并转为输入模式
I: 转为输入模式并定位到光标所在行的行首
A: 转为输入模式并定位到光标所在行的行尾
O: 在光标所在行的上方新建一行并转为输入模式
末行模式: 点ESC键后再点冒号进入
行号d: 即可直接删除指定行。10,20d即可删除10至20行
set nu: 显示行号number
nonu: 取消显示行号
ic、noic: 区分或不区分大小写ignorecase
ai、noai: 换行自动缩进autoindent
hlsearch、nohlsearch: 搜索匹配到的字符高亮
syntax on\off: 开启或关闭语法高亮
! shell命令: 可执行外部其他命令,回车后立刻回来
num: 移动到第几行
/PATTERN: 查找匹配字符,从头到尾。可使用正则
?PATTERN: 查找匹配字符,从光标到头部倒着找
查找时: n键表示下一个,N表示上一个
移动光标:初始模式下
=号表示数字,可选。先加数字则表示移动相应的单位
=h左、=l右、=j下、=k上:四个方向移动
=w: 跳至下一个单词的词首
=b: 跳至前一个词的词首
=e: 跳至下一个单词的词尾
=G: 跳至第几行
G: 跳至最后一行
翻屏:初始模式下
Ctrl+f: 向下翻一屏
Ctrl+b: 向上翻一屏
Ctrl+d: 向下翻半屏
Ctrl+u: 向上翻半屏
删除:初始模式下
=x: 从光标所在位置开始删除=个字符
d: 配合此模式下的移动光标方法可快速删除
=dd: 删除光标所在行
=cc: 与d命令相同,不同点是删除后进入编辑模式
粘贴:初始模式下
P: 如果删除或复制的是整行内容,则粘贴到光标所在的下方,如果不是整行则粘贴到光标所在的后面
p: 如果删除或复制的是整行内容,则粘贴到光标所在的上方,如果不是整行则粘贴到光标所在的前面
复制: 初始模式下
=yy: 同d命令
撤销: 初始模式下
=u: 撤销,可连续向前撤销
Ctrl+r:可以将撤销的操作还原
重复上次操作:初始模式下
.: 点命令重复前次操作
可视化选择:初始模式下
v: 从光标处开始自由选择,然后配合其他命令
V:从光标所在行开始上下自由选择
查找并替换:末行模式
开始行,结束行s@匹配@替换@gi
开始行,结束行: 如果是全文则可以使用%
开始行可以用点,表示光标所在行开始
vim编辑多个文件: 末行模式
next: 切换至下一个文件
prev: 切换至上一个文件
last: 切换至最后一个文件
first: 切换至第一个文件
分屏显示:
Ctrl+w 松开后 s: 水平拆分窗口
Ctrl+w 松开后 v: 垂直拆分窗口
Ctrl+w 松开后上下左右:切换光标所在窗口
vim -o 多文件路径:则水平多屏显示多个文件
vim -O 多文件路径:则垂直多屏显示多个文件
q: 退出
qa: 可退出打开的多个文件或多屏
wq: 保存并退出。相当于x
w: 保存
开始行,结束行w 文件路径:可以实现部分内容另存
w!: 强行保存
q!: 强行退出
ZZ: 在开始模式下保存并退出
r 文件路径:将另外文件内容加入此文件的光标所在行的下行
文件查找: 不同于文本内容查找
locate: 直接去找系统的文件数据库。
速度快,但是不准确。
模糊查找,路径和文件名中匹配
新增文件不一定找到,需要 updatedb。
find 路径 查找标准 找到后的处理动作: 精确查找文件
路径: 默认当前路径
查找标准:
-name 文件名: 则精确匹配文件名,或者文件名可以使用通配符
-iname 文件名:同上不区分大小写
-regex pattern:使用正则
-user 用户名: 查找属主名的文件
-nouser: 查找没有属主的文件
-nogroup: 查找没有属组的文件
-uid UID: 根据uid查找
-gid GID: 根据gid查找
-type : 根据文件类型查找
d: 目录
f: 文件
c: 字符设备。按字符为单位,线性设备。键盘
b: 块设备。按块为单位,随机访问的设备。硬盘
-size _: 根据文件大小( 默认bite )
+ 、—: 大于多少或小于多少
+5k: 大于5KB的文件
5M: 5MB大小(最大4M-5M范围内)
5G: 5GB大小
-mtime _: 修改时间
_: +\- 大于多少天或小于多少天
-ctime _: 改变时间
-atime _: 访问时间
-mmin、-cmin、-amin: 同上,但是单位是 分钟
-perm: 权限匹配
查找标准可配合逻辑运算组合使用:
    -not: 非
    -a: 逻辑与
    -o: 逻辑或

处理动作:
    -print: 默认显示出来
    -ls: 类似 ls -l命令
    -ok CMMAND {} \;:表示查找到的文件使用命令操作他们。 每个匹配文件都需要确认
    -exec CMMAND {} \;:同上,不同于ok,每个匹配到的文件执行cmmand后不需要确认
    其中CMMAND是命令 {}代表找到的文件名,而 \; 是固定格式结束符
    xarg: 使用前必须用管道|。将结果导入文件则可以使用它,并且不用{}即可
特殊权限: 不同于rwx权限
chmod u+s\g+s: 添加特殊权限,如果原文件有x权限则显示S,否则显示s。
用户使用命令时,此命令本身有相应权限,启动后命令变为相应进程,此进程的权限则为此用户权限。
进程操作文件时,对比此用户是否有操作此文件的权限,有则继续,无则提示。
而给命令赋予特殊权限后,此进程不再是此用户的权限,而是保持命令本身原有的权限再去操作文件,此时只要此命令原有权限能操作此文件即可。
例:命令passwd
chmod o+t: 一般对目录操作,表示在一个目录中只能对自己创建文件操作,不可删除他人文件。
特殊权限组合到权限系统中则是sst->521
特殊权限位在rwx前: 例如5 755
FACL权限系统: 把用户文件的权限给指定的另外的用户
setfacl -m u:指定用户名:所给权限 指定文件: 设置此权限。把指定文件的权限给指定用户
setfacl -m g:指定用户名:所给权限 指定文件: 设置此权限。把指定文件的组权限给指定用户
setfacl -m d:u:指定用户名:所给权限 指定文件: 同上,不同的是对目录设置
setfacl -x u\g:指定用户 指定文件: 取消指定用户的FACL权限
getfacl 文件:获取文件的facl信息
常用命令
w: 显示登录到系统的用户以及正在做的事情
who: 显示登录到系统的当前用户有哪些及终端与时间
console: 控制台。使用硬件设备直接连接本地系统
pty: 物理终端。
pts/=: 伪终端。
tty=: 虚拟终端。
ttys=: 串行终端。
whoami: 显示当前登录到系统的有效用户
witch: 查找可执行命令的文件所在位置
whereis: 查找程序
whatis: 查找命令的简单介绍
last: 查看用户登录历史及重启历史。访问/var/log/wtmp文件
-n =: 显示最近的几次记录
lastb: 显示用户错误的登录历史。/var/log/btmp文件。-n =: 显示最近的几次记录
lastlog: 显示每一个用户的最近一次登录时间
-u USERNAME: 查看指定用户的最近登录信息
basename: 直接获取文件的基名。就是去掉路径只显示文件名
$0: 此脚本的基名
mail: 邮件系统。查看一次下次就不再显示,邮件须在家目录的mbox下查看
查看邮件内容 1, q表示退出
cat /etc/fstab | mail -s "你好" imix: 表示向imix用户发送标题为你好,内容为fstab文件内容的邮件。
mail -s "你好" imix < /etc/fstab: 同上
hostname: 获取当前系统主机名,$HOSTNAME
随机数生成:
$RANDOM: 随机生成一个0-32768的数
ln: 创建硬链接。此时删除其中一个另一个不受影响,只能对文件不能目录
-s -v: 创建符号链接。加v则显示过程。指向源文件,大小为路径大小
du: 显示每个文件的大小
-s: 显示整个文件的大小
-h: 增加可读性
df: 报告文件磁盘使用情况
-Ph
/dev: 设备 (crw--w----. 1 root tty  4,  11 8月  19 11:45 tty11-->其中4是主设备号,11次设备号) 
主设备号
次设备号
mknod: 创建设备文件。只是用来给设备提供入口的
[-m 权限] 文件名 类型(b\c等) 主设备号 次设备号
例: mknod -m 640 mydeb b 66 0
tty: 显示当前终端连接的设备号。每个用户都有对应路径。
磁盘设备的设备文件名:
IDE,ATA: 此类设备以 hd开头
SATA,SCSI,USB: 此类设备以 sd开头
多块同类设备用a,b,c…等区分
每块设备分区后使用数字划分。例hda1,hda2…
hda1-4是主分区的号码,逻辑分区一定是从5开始编号
fdisk -l: 列出系统的所有磁盘及磁盘分区
帮助命令m:
p: 显示当前硬件分区
n: 创建新分区。主分区只能1-4。开始柱面默认即可,结束柱面则不指定而是+20G即可
e: 创建扩展分区
p: 创建主分区
d: 删除一个分区
w: 保存并退出
q: 不保存退出
t: 修改分区类型
L: 类型列表
l: 显示所有支持的分区
修改完成后内核并没有 cat /proc/partitions
需要使用partx [/dev/sda]
mkfs [t] 指定分区: 创建文件系统
-t FSTYPE: 指定文件类型
mke2fs: 专用于创建ext系列文件系统的命令
blkid 设备文件: 查看磁盘属性信息
e2label 设备文件 卷标: 用户查看或定义卷标
tune2fs: 调整文件系统的相关属性
dumpe2fs: 显示文件信息
fsck: 检查并修复Linux文件系统
e2fsck: 专用修复ext系列文件系统
mkswap: 创建交换分区
swapon:
-a: 启用所有交换分区
swapoff:
mount 设备 挂载点: 挂载设备
设备: 可以是设备文件(例/dev/sda5)、卷标 LABEL=""、UUID=""
挂载点,要求:
1、此目录没有被其他设备使用
2、目录存在
3、原目录中的文件将被暂时隐藏
mount: 显示当前系统已经挂载的设备
-a:
-n:
-t:
-r:
-w:
-o:

-o loop: 挂载本地回环设备。比如ISO
-w:
umount 设备或挂载点: 卸载设备(当前用户不能在里面)
free: 查看内存以及交换空间大小
-m: 增加可读性
dd: 复制文件。可以复制部分。
wget: 下载文件
压缩、解压缩命令
gzip: 压缩并删除原文件
-d: 解压缩同等于gunzip
-=: 指定压缩比 1-9 默认6
gunzip: 解压缩并删除压缩文件
zcat: 可以直接查看压缩的文本文件
bzip2: 同于gzip。比它更厉害
-d、-=
-k: 可保留源文件
bunzip2: 解压
bzcat: 可以直接查看压缩的文本文件
xz: 同bzip2更好
unxz: 解压
xzcat: 可以直接查看压缩的文本文件
zip 压缩后的文件名 所压缩1 所压缩2 …: 归档后压缩并且不删除源文件。可压缩目录
unzip: 解压缩
tar: 打包归档工具。不压缩
-cf 包名 要打包1 要打包2…: 打包
-xf 包名: 展开包
--xattra: 打包时保留文件的扩展属性信息
-t: 只查看下包里面的内容。不打开。可以配合压缩查看
-zcf: 打包并使用gzip压缩
-zxf: 使用gzip解压并展开包
-jcf: 打包并使用bzip2压缩
-jxf: 使用bzip2解压并展开包
-Jcf: 打包并使用xz压缩
-Jxf: 使用xz解压并展开包
cpio: 古老的打包工具
read 变量名 变量名2…: 用户输入内容已空格隔开赋予每个变量
-p: 接收用户输入前先输出提示
-t: 等待用户输入的时间
网络: 使用ifconfig只能暂时生效可直接修改配置文件。/etc/sysconfig/network-scripts/ifcfg-网卡名
ifconfig eth= ip/掩码位数: 配置ip
ifconfig eth= [up|down]: 启用或禁用ip
eth=:=: 一个网卡多个地址
route: 配置路由
add: 添加路由
-host: 主机路由
-net: 网络路由
例: route add -net IP/掩码
del: 删除路由
-host: 主机路由
-net: 网络路由
rpm包: 基本格式
name-version-release.arch.rpm
例如: bash-4.3.2-2.e16.x86_64.rpm
bash-4.3.2表示设计bash的版本号
2.e16表示某个平台将bash源码做成的rpm包
redhat enterprise linux 6 第2版
arch表示此包专用的平台
有: x86_64\i386\i586\i686\ppc\noarch
或者noarch表示不限制平台
rpm -i(--install) RPM包…: 安装。常用 -ivh
-h: 显示进度条
-v: 显示详细安装过程
-vv:显示更详细的安装过程
--nodeps: 忽略依赖关系
--oldpackage: 降级安装
--force: 强行安装
--replacepkgs: 替换安装
--test: 仅测试,并不是真正安装
-q: 查询指定包是否安装
-qa: 查询已经安装的所有包。配合管道给grep可以查到已安装的指定软件
-qi: 查询指定安装包的说明信息
-ql: 查询指定安装包安装后生成的文件列表
-qf: 查询指定文件是由哪个安装包生成的
-qc: 查询指定包安装的配置文件
-qd: 查询指定包安装的帮助
-q --scripts: 查询指定包中包含的脚本(安装前的、安装后的、卸载前、卸载后)
-qp(加上a、i、l、f、c、d等): 安装包尚未安装时,要查询其各种信息则可以使用对应命令
-Uvh: 升级。如果有老版本则升级,没有则安装
-Fvh: 升级。如果有老版本则升级,没有则退出
-e: 卸载
-V: 校验
-K: 验证来源的合法性。
--improt: 导入密钥。倒入之后再使用 K
--rebuilddb: 重建数据库
--initdb: 初始化数据库。有数据库则不执行
yum: 自动从仓库或网上下载软件安装
/etc/yum.conf
/etc/yum.repos.d/*.repo
repolist [all|enabled|disabled]: : 列出所有可用的仓库
clean [all|packages|metadata|expire-cacah|rpmdb|plugins]: 清理缓存
list [all|installed|available]: 列出源的rpm包
info 包名: 安装包的详细信息
grouplist: 列出所有的包组
grouplist 包组名: 显示包组信息
install 包名…: 安装指定包
reinstall 包名…: 重新安装指定包
update 包名: 升级指定的包
downgrade 包名: 降级
remove/erase 包名: 卸载
whatprovides|provides 文件: 查询某文件是由哪个包安装生成的
groupinstall 包组名: 安装指定的包组
groupremove 包组名: 卸载指定的包组
history: 查看操作记录
yum配置文件中的宏:
$releasever: 对Yum而言指的是redhat-release主版本号
$arch: 系统CPU架构
$basearch: 基础架构 如i685 i586 等基本架构则是i386
$YUM0-9: 在系统中定义的环境变量
配置yum源文件格式: 配置的yum源放在/etc/yum.repos.d/中并以.repo结尾
[repo_ID]
name=名字(repolist命令会列出此名字)
baseurl=仓库访问路径(找到有repodata文件的父目录即可)(远程的地址需要使用对应的协议如http、ftp、file等)
enabled=0或1 是否启用这个配置
gpgcheck=0或1是否验证来源的可靠性、如开启则gpgkey项必须配置
gpgkey=公钥文件路径
cost=定义此源开销默认1000、越小越优先
创建自己的YUM源
例如: /media/cdrom 这个目录做源。此目录下有rpm安装包
createrepo /media/cdrom: 创建yum仓库数据库
使用此命令后会在cdrom下自动创建repodata文件夹
制作yum配置文件
[唯一的yum源名字]
name=源标识
baseurl=file:///media/cdrom/
enabled=1 =启用此源
=OK!
将命令设置为全局:
方式1、需要在/etc/profile中添加全局路径。之后使用source /etc/profile: 重读配置文件生效。或者重新登录
方式2、在/etc/profile.d/ 目录下建 .sh结尾文件,内容 export PATH=$PATH:新命令路径
netstat: 显示网络连接
-r: 显示路由表
-n: 以数字方式显示
-t: 显示以tcp连接
-u: 显示udp连接
-l: 显示监听状态的连接
-p: 显示监听指定的套接字的进程及进程号
ldconfig -v: 列出所有库文件
进程: /proc 此文件夹中保存所有进程已文件形式。
进程列表(ps -aux显示所有进程)每项的含义:
USER: 进程用户
PID: 进程id号
%CPU: 占用cpu百分比
%MEM: 使用内存百分比
VSZ: 虚拟内存集
RSS: 长度内存集
TTY: 所连接的终端
START: 启动时间
TIME: 使用CPU的运行时长
COMMAND: 哪个命令启动的此进程。加[]是内核进程
STAT: 状态码
D: 不可中断的睡眠
R: 运行或就绪
S: 可中断的睡眠
T: 停止
Z: 僵死
<: 高优先级进程
N: 低优先级进程
+: 前台进程组中的进程。终端相关
l: 多线程进程
s: 会话进程首进程。父进程
ps: Process State 进程状态
-a: 显示跟终端有关的进程
-u: 显示所有进程
-x: 显示所有跟终端无关的进程
-e: 显示部分列进程
-ef: 显示全部列进程
-o: 显示指定列进程信息
pstree: 进程树
pgrep: 显示grep风格的进程。匹配相关进程
pidof: 查询某个进程的ID号
top: 实时监控系统进程
进入监控界面:
M: 根据内存字段排序
P: 根据CPU使用情况排序
T: 根据时间字段排序
l: 是否显示平均负载和启动时间
t: 是否显示进程已经CPU状态信息
m: 是否显示内存相关信息
c: 是否显示完整的命令行信息
q: 退出
k: 杀死某个进程。加id号
参数:
-d: 设置刷新频率。单位秒
-b: 是否分页显示
-n: 指定显示几页
vmstat: 系统状态查看
例: vmstat 1 5: 每隔一秒刷新一次,共刷新5次
uptime: 系统启动时间。同top命令的第一行
free: 空间使用情况
kill [方式] 进程号: 结束进程
结束进程方式: 使用kill -l可查看。其中:
1:SIGHUP: 是进程不重启即可重读配置文件并生效
2:SIGINT: 中断进程。同Ctrl+c
9:SIGKILL: 杀死进程
15:SIGTERM: 默认方式。终止进程
killall 进程名: 叫此名字的进程都杀死。其他同kill
pKill: 杀死指定进程
jobs: 查看后台所有作业。区别进程
bg 作业ID: 让后台停止的作业继续进行
fg 作业ID: 将后台作用转到前台
kill %作业ID: 终止作业
调整进程优先级:
已启动进程: renice 调整后级别数 进程PID
未启动进程: nice -n 调整后级别数 命令
前台转后台:
Ctrl+z: 将正在运行的命令转到后台运行
COMMAND &: 按的符号也行
/proc/meminfo 可使用cat命令查看。内存信息
chroot: 临时改变根目录。改变前必须有bash和其对应的库文件
ldd: 查看命令运行所需要的所以库文件
系统运行级别:
0: 关机
1: 直接以管理员身份切入。无需密码
2: 多用户模式但不加载网络文件系统NFS
3: 多用户模式且没有界面。是命令行模式
4: 保留级别
5: 默认级别。多用户模式并启动桌面
6: 重启
runlevel: 查看运行级别
uname -r: 查看内核版本号
who -r: 查看运行级别

如果觉得我的文章对您有用,请随意赞赏。您的支持将鼓励我继续创作!

发表回复