套路
1) 更新镜像源
2) 配置防火墙
3) 安装 OpenSSH 服务器
Debian 软件包
# 查询所有已安装的软件包
dpkg-query -l
# 查询指定已安装软件包的详细信息
dpkg-query -l "软件包名称"
# 安装软件包
dpkg -i <软件包>
# 显示软件包的版本
dpkg -l <软件包名称>
# 查看软件包的详细信息
dpkg -s <软件包名称>
# 卸载软件包(保留配置)
dpkg -r <软件包名称>
# 卸载软件包(不保留配置)
dpkg -P <软件包名称>
APT安装包管理器
# 更新镜像源地址
apt-get update
# 安装软件
apt-get install <软件名>
# 卸载软件
apt-get remove <软件名>
# 查看软件的缓存信息
apt-cache show <软件名>
修改镜像源地址
# 备份
cp /etc/apt/sources.list /etc/apt/sources.list.backup
# 清空
echo "" > /etc/apt/sources.list
# 编辑
vim /etc/apt/sources.list
# Ubuntu 20.04 LTS
# 默认注释了源码镜像以提高 apt update 速度,如有需要可自行取消注释
deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ focal main restricted universe multiverse
# deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ focal main restricted universe multiverse
deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ focal-updates main restricted universe multiverse
# deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ focal-updates main restricted universe multiverse
deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ focal-backports main restricted universe multiverse
# deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ focal-backports main restricted universe multiverse
deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ focal-security main restricted universe multiverse
# deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ focal-security main restricted universe multiverse
deb http://archive.ubuntu.com/ubuntu/ trusty main universe restricted multiverse
# 预发布软件源,不建议启用
# deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ focal-proposed main restricted universe multiverse
# deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ focal-proposed main restricted universe multiverse
# 更新镜像源地址
apt-get update
Linux远程登录
# 安装 SSH 服务
apt-get install openssh-server
service ssh restart
# Linux 登录到 Linux
ssh 用户名@主机名
文本编辑器
vim [文件名]
# 复制一行
[yy]
# 复制多行
数值yy
# 粘贴
[p]
# 删除一行
[dd]
# 删除多行
数值dd
# 撤销
[u]
# 显示行号
:set nu
# 不显示行号
:set nonu
# 查找字符(输入完成后按回车键)
/字符
# 查找下一个
[n]
# 移动到第一行
[gg]
# 移动到最后一行
[G]
# 移动到指定行(输入完成后按 Shift + g )
行号
执行命令
# 以后台的方式执行命令
命令 &
# 当命令1执行成功后,再来执行命令2
命令1 && 命令2
关机
# 同步内存的数据到硬盘
sync
# 关机
shutdown -h now
# 同步内存的数据到硬盘
sync
# 重启
reboot
用户管理
# 添加用户
# -m 自动创建用户目录
# -g 指定用户组
# -s 指定用户登录时所使用的shell名称
useradd -m -g [用户组] -s /bin/bash [用户名]
# 修改用户密码
passwd [用户名]
# 修改 root 用户密码
sudo passwd
# 删除用户
userdel [用户名]
# 删除用户并删除用户目录(不推荐使用)
userdel -r [用户名]
# 修改用户所在的组
usermod -g [用户组] [用户名]
# 添加用户组
groupadd [名称]
# 删除用户组
groupdel [名称]
# 查看当前登录的用户
whoami
# 查询用户消息
id [用户名]
# 切换用户
su - [用户名]
# 退出当前用户
exit
指定运行级别
# 1 安全模式(命令行界面)
# 2 离线模式(命令行界面)
# 3 联网模式(命令行界面)
# 5 联网模式(图形化界面)
init [数值]
获取帮助信息
# 命令可以是任意命令,例如 ls 、vim 等(按 q 退出)
man [命令]
获取 shell 内置命令的帮助信息
# 命令必须是shell的内置命令
help [命令]
目录路径
# 根目录
/
# 当前目录
./
# 上一级目录
..
../
# 当前用户的 home 目录
~
/home/用户名
显示当前工作目录的绝对路径
pwd
查看当前目录的内容信息
# 简短信息
ls [目录]
# 显示隐藏的文件和目录
ls -a [目录]
# 显示详细内容
ls -l [目录]
# 显示详细内容,并将文件大小以更友好的方式显示
ls -lh [目录]
# 显示简短信息,并递归显示该目录下所有子目录中的内容
ls -R [目录]
切换目录
# 目录可以是绝对路径或相对路径
cd [目录]
# 返回上一级目录
cd ..
# 回到自己的家目录
cd ~
创建文件夹
# 创建多级目录,目录可以是绝对路径或相对路径
mkdir -p [文件夹]
删除空文件夹
rmdir [空文件夹]
删除文件与非空目录
# 删除非空目录
# -r 递归删除文件
# -f 强制删除
rm -rf [目录]
# 删除文件
rm -f [文件]
创建空文件
touch [文件名]
拷贝
# 从源拷贝到目标
cp [源] [目标]
# 拷贝目录
# -r 递归复制文件夹
# -t 指定目标文件夹
cp -r [源] [目标] -t [目标文件夹]
# 强制覆盖文件或目录
\cp [源] [目标]
移动与重命名
# 重命名(源与目标必须在同一文件夹下)
mv oldFile newFile
# 移动
mv /temp/oldFile newFile
查看文件内容
# 显示文件内容
cat [文件]
# 显示文件内容,并显示行号
cat -n [文件]
# 分页显示
cat [文件] | more
分页显示文件内容
more [文件]
######### 快捷键 #########
# 向下翻页
[Space]
# 向下翻一行
[Enter]
# 退出
[q]
# 返回上一屏
[Ctrl + B]
# 返回下一屏
[Ctrl + F]
# 输出当前行的行号
[=]
# 输出当前行的行号和文件名
:f
分页查看文件内容(以按需加载的方式查看,文件大时效率高)
less 文件
######### 快捷键 #########
# 向上翻页
[Ctrl + B]
[PageUp]
# 向下翻页
[Ctrl + F]
[PageDown]
[Space]
# 向下翻一行
[Enter]
# 向下搜寻字符串(n:向下查找、N:向上查找)
/字符
# 向上搜寻字符串(n:向下查找、N:向上查找)
?字符
# 退出
[q]
覆盖与追加文本内容
# > 覆盖
# >> 追加
# 例子:
# 将列表内容覆盖到文件中
ls -lh > [文件]
# 将列表内容追加到文件中
ls -alh >> [文件]
# 将文件1的内容覆盖到文件2中
cat [文件1] > [文件2]
# 将内容追加到文件中
echo "内容" >> [文件]
输出内容到控制台
# 输出内容到控制台
echo "内容"
输出文件部分内容到控制台
# 显示文件开头内容(默认显示10行)
head [文件]
# 显示文件开头指定行数的内容
head -n [数值] [文件]
# 显示文件结尾内容(默认显示10行)
tail [文件]
# 显示文件结尾指定行数的内容
tail -n [数值] [文件]
# 实时追踪文件的所有更新
tail -f [文件]
软连接(类似于快捷方式)
# -s 使用符号链接代替硬链接
ln -s [文件或目录] [软连接名称]
查看已经执行过的历史命令
# 查看所有执行过的命令
history
# 查看最近执行过的命令(指定数量)
history [数值]
# 执行指定历史编号的命令
!行号
日期时间
# 显示当前时间
date
# 显示指定格式的日期时间
date "+%Y-%m-%d %H:%M:%S"
# 设置系统时间
date -s "2021-01-23 13:23:53"
# 查看日历
cal
# 查看指定年份的日历
cal 2021
查找文件与目录
######### find #########
# 查找指定目录中指定名称的文件或目录(可以使用 * 通配符)
find [目录] -name [名称]
# 查找指定目录中所有者为 root 用户的文件或目录
find [目录] -user root
# 查找指定目录中大于 20MB 的文件
find [目录] -size +20M
# 查找指定目录中小于 20kb 的文件
find [目录] -size -20k
# 查找指定目录中等于 20MB 的文件
find [目录] -size 20M
# 查找指定目录中最后修改时间是在n*24小时前的文件。
find [目录] -mtime +n
# 查找指定目录中最后修改时间是在n*24小时内的文件。
find [目录] -mtime -n
# 查找指定目录中最后修改时间是n*24小时的文件。
find [目录] -mtime n
# -exec 将每一条查找到的内容作为参数,放入到命令中执行
# {} 代表每一条查找到的内容
# \; 执行结束符(由于 ';' 需要转义才能使用,因此在其前面加上 '\' )
# 查找指定目录中所有的txt文件,显示其文件名
find [目录] -name "*.txt" -exec basename {} \;
# 查找指定目录中文件大小大于 4kb 的文件,显示文件的父路径、文件名
find /home -size 4k -exec echo "----------" \; -exec dirname {} \; -exec basename {} \;
######### locate #########
# 更新 locate 数据库
updatedb
# 搜索文件
locate [文件名]
检索文本内容
# 在指定文件中查找指定内容
grep [要检索的内容] [文件名]
# 在指定文件中查找指定内容,并显示行号
grep -n [要检索的内容] [文件名]
# 在指定文件中查找指定内容(忽略大小写)
grep -i [要检索的内容] [文件名]
# 在指定文件中查找指定内容(使用正则表达式)
grep "正则表达式" [文件名]
# 管道符号(将前一个命令的处理结果传递给后面的命令处理)
|
# 配合其他指令使用
cat a.txt | grep -n hello
ls -lh | grep -ni x
压缩与解压缩
######### gzip #########
# 压缩(压缩完成后删除源文件)
gzip [文件]
# 解压缩(解压缩完成后删除源文件)
gunzip [文件名.gz]
######### zip #########
# -r 递归压缩目录
# -d 指定解压后文件的存放目录
# 压缩文件
zip [文件名.zip] [要压缩的文件]
# 压缩目录
zip -r [文件名.zip] [要压缩的目录]
# 解压缩
unzip -d [要解压到的目录] [文件名.zip]
######### tar.gz #########
# -z 打包同时压缩
# -c 产生 .tar 文件
# -x 解压 .tar 文件
# -v 显示详细信息
# -f 指定压缩后的文件名
# -C 指定解压到的目录
# 压缩
tar -zcvf [文件.tar.gz] [要压缩的文件]
# 解压缩
tar -zxvf [文件.tar.gz] -C [要解压到的目录]
修改文件所有者
# -R 递归更改目录下的所有文件和目录
# 改变所有者
chown -R [用户] [文件或目录]
# 改变所在组
chgrp -R [用户组] [文件或目录]
# 同时改变所有者与所在组
chown -R [用户]:[用户组] [文件或目录]
文件权限
######### 文件权限 #########
# 作用于文件
r:读取
w:修改(不代表可以删除该文件;删除文件的前提条件是对该文件所在的目录有 w 写权限,才能够删除该文件)
x:执行
# 作用于目录
r:读取、查看目录内容
w:修改,可在目录内删除、创建、重命名
x:进入目录
# 也可以用数字标识
r:4
w:2
x:1
rwx = 4 + 2 + 1 = 7
rw- = 4 + 2 = 6
r-- = 4
-wx = 2 + 1 = 3
-w- = 2
r-x = 4 + 1 = 5
--x = 1
--- = 0
修改文件权限
# u 所有者
# g 所在组
# o 其他组
# a 全部用户和组(包括 u、g、o)
# = 覆盖
# + 添加
# - 减去
# 修改权限为 rwxr-xr--
chmod u=rwx,g=rx,o=r [文件或目录]
# 为所在组减去 x 执行权限
chmod g-x [文件或目录]
# 为其他组增加 w 写权限
chmod o+w [文件或目录]
# 为全部用户和组设置为 r 读权限
chmod a=r [文件或目录]
# 修改权限为 rwxr-x--x
chmod 751 [文件或目录]
定时任务调度
######### 语法 #########
# -e 编辑 crontab 定时任务
# -l 查询 crontab 定时任务
# -r 删除当前用户所有的 crontab 定时任务
# 编辑定时任务
crontab -e
# 查看当前用户的任务调度
crontab -l
# 删除当前用户的所有任务调度
crontab -r
# 重启任务调度
service cron restart
######### 占位符说明 #########
* * * * *
# 项目 含义 范围
# 第一个"*" 分钟 0-59
# 第二个"*" 小时 0-23
# 第三个"*" 日 1-31
# 第四个"*" 月 1-12
# 第五个"*" 星期 0-7( 0 和 7 都代表星期日)
######### 特殊符号说明 #########
* 任意时间。比如第一个"*"就代表每分钟都执行一次
, 不连续的时间。比如"0 8,12 * * *"命令,就代表在每天的8点0分,12点0分都执行一次命令
- 连续的时间范围。比如"0 5 * * 1-6"命令,代表在周一到周六的凌晨5点0分执行一次命令
*/n 每隔多久执行一次。比如"*/10 * * * *"命令,代表每隔10分钟就执行一次命令
######### 案例 #########
45 22 * * * 每天的22点45分执行命令
0 17 * * 1 每周一的17点0分执行命令
0 5 1,15 * * 每月1号和15号的凌晨5点0分执行命令
40 4 * * 1-5 每周一到周五的凌晨4点40分执行命令
*/10 4 * * * 每天凌晨4点开始,每隔10分钟执行一次命令
0 0 1,15 * 1 每周一、每月1号和15号的0点0分执行命令(最好不要这样写,因为它们定义的都是天,非常容易混淆)
######### 套路 #########
(1) 编写文件
(2) 给文件添加 x 执行权限
(3) 将文件添加到任务调度中
驱动器标识符
######### 驱动器标识符 #########
# 磁盘标识符 disk
[设备类型][磁盘类型]
# 分区标识符 part
[设备类型][磁盘类型][分区号]
# 例如
hdc IDE硬盘,辅助主盘
sda SCSI硬盘,基本盘
hdb2 IDE硬盘,基本从属盘,第二个主分区或拓展分区
sda1 SCSI硬盘,基本盘,第一个主分区或拓展分区
sdd5 SCSI硬盘,辅助从属盘,第五个逻辑分区
######### 设备类型 #########
IDE硬盘 hd
SCSI硬盘 sd
######### 磁盘类型 #########
a 基本盘
b 基本从属盘
c 辅助主盘
d 辅助从属盘
######### 分区号 #########
前四个分区用数字 1 到 4 表示,它们是主分区或拓展分区,从 5 开始是逻辑分区
查看磁盘块列表
# 查看块列表
lsblk
# 查看块列表,以文件系统的方式
lsblk -f
添加硬盘并挂载分区
######### 套路 #########
(1) 为机器添加硬盘(关机添加 / 添加后重启)
(2) 创建分区
(3) 格式化分区(创建文件系统)
(4) 挂载分区(重启后失效)
(5) 设定自动挂载分区(永久挂载,重启后不会失效)
######### 创建分区 #########
# 进入文件磁盘模式
fdisk /dev/[磁盘标识符]
# 获取帮助
m
# 创建新分区
n
# 类型为主分区
p
# 保存分区表并退出
w
######### 格式化分区 #########
# 创建文件系统,类型为 ext4
mkfs -t ext4 /dev/[分区标识符]
######### 挂载分区 #########
# 将文件系统挂载到指定目录,使其形成关联
mount /dev/[分区标识符] [目录]
######### 设定自动挂载分区 #########
# 修改 /etc/fstab 文件系统表
vim /etc/fstab
# 以下内容 2 选 1 添加即可
# 文件系统 挂载点 类型 选项 dump pass
/dev/[分区标识符] [目录] ext4 defaults 0 0
UUID=[分区的UUID] [目录] ext4 defaults 0 0
# 挂载 /etc/fstab 中所有的文件系统
mount -a
######### 卸载分区 #########
umount /dev/[分区标识符]
umount [目录]
磁盘情况查询
# 查看磁盘文件系统使用情况
# -l 将列表限制为本地文件系统
# -h 以更友好的方式显示空间大小
df -lh
# 查看指定目录的使用情况
# -h 以更友好的方式显示空间大小
# -a 列出明细,所有文件
# --max-depth=数值 列出明细,子目录的深度
# -c 列出明细,并统计总用量
# -s 不列出明细,仅统计总用量
# 列出明细 与 不列出明细 是互斥的
du [选项] [目录]
统计行数
# -l 打印换行符个数
# 打印每个文件的换行符个数、字数和字节数
wc [选项]
统计磁盘情况的实用指令
# 统计 /home 目录下文件的个数
ls -al /home | grep "^-" | wc -l
# 统计 /home 目录下子目录的个数
ls -al /home | grep "^d" | wc -l
# 统计 /home 目录下文件的个数,包括子目录内的
ls -alR /home | grep "^-" | wc -l
# 统计 /home 目录下子目录的个数,包括子目录内的
ls -alR /home | grep "^d" | wc -l
# 以树状显示 /home 的目录结构
tree /home
配置网络
# Ubuntu 20.04.1 LTS
# 修改 /etc/netplan/01-network-manager-all.yaml 配置文件
vim /etc/netplan/01-network-manager-all.yaml
# YAML
# 修改为以下内容
network:
version: 2
renderer: NetworkManager
ethernets:
ens33:
dhcp4: false
addresses: [本机ip地址/子网掩码位数]
gateway4: 网关ip地址
nameservers:
addresses: [网关ip地址]
# 应用该配置
netplan apply
查看进程
# -a 查看当前终端的所有进程
# -u 以用户的格式显示进程
# -x 查看后台进程
# 查看进程
ps -aux
USER 用户名
PID 进程ID
%CPU CPU占用百分比
%MEM 内存占用百分比
VSZ 虚拟内存占用(单位:KB)
RSS 物理内存占用(单位:KB)
TTY 使用的终端
STAT 进程状态( S:睡眠 s:该进程是会话的先导进程 N:进程拥有比普通优先级更低的优先级 R:正在运行 D:短期等待 Z:僵死进程 T:被跟踪或者被停止 )
START 启动时间
TIME 占用CPU的总时间
COMMAND 进程执行时的命令行
# -e 查看所有进程
# -f 以全格式的方式显示
# 以全格式的方式查看进程
ps -ef
UID 用户ID
PID 进程ID
PPID 父进程ID
C CPU用于计算执行优先级的因子(数值越大,优先级越低,代表该进程时CPU密集型运算;数值越小,优先级越高,代表该进程是I/O密集型运算)
STIME 进程的启动时间
TTY 终端名称
TIME CPU时间
CMD 启动进程时所用的命令和参数
# 查看进程树
# -p 显示进程的PID
# -u 显示进程所属的用户
pstree [选项]
终止进程
# -9 强制终止进程
# 终止单个线程
kill [选项] [进程号]
# 终止所有匹配的线程(支持通配符)
killall [进程名称]
服务
# 服务本质就是进程
# 查看所有服务的状态
service --status-all
# 更改指定服务的状态
# start 启动服务
# stop 停止服务
# reload 重载服务
# force-reload 强制重载服务
# restart 重启服务
# try-restart 尝试重启服务
# status 查看服务状态
service [服务名称] [操作]
######### 例子 #########
# 启动防火墙服务
service ufw start
# 关闭 SSH 服务
service ssh stop
防火墙
# 启用/禁用防火墙
ufw enable|disable
# 查看防火墙状态
ufw status
# 默认允许/拒绝所有连接
ufw default allow|deny
# 允许/拒绝指定端口
ufw allow|deny [端口号、端口号/tcp|udp、服务名]
# 删除允许/拒绝指定端口
ufw delete allow|deny [端口号、端口号/tcp|udp、服务名]
# 允许/拒绝指定ip地址
ufw allow|deny from [ip地址]
# 删除允许/拒绝指定ip地址
ufw delete allow|deny from [ip地址]
# 允许/拒绝指定ip地址的tcp/upd连接指定端口
ufw allow|deny [proto tcp|udp] from [ip地址/子网掩码位数] to [any|本地ip地址] port [端口号、端口号/tcp|udp、服务名]
# 删除允许/拒绝指定ip地址的tcp/upd连接指定端口
ufw delete allow|deny [proto tcp|udp] from [ip地址/子网掩码位数] to [any|本地ip地址] port [端口号、端口号/tcp|udp、服务名]
# 查看协议对应的端口
less /etc/services
######### 案例 #########
# 启用防火墙
ufw enable
# 默认拒绝所有连接
ufw default deny
# 允许 80 端口
ufw allow 80/tcp
# 允许 22 端口
ufw allow 22
# 拒绝 21 端口
ufw deny 21
# 允许 smtp 端口
ufw allow smtp
# 删除允许 110 端口
ufw delete allow 110
# 允许 17.16.10.2 访问 192.168.199.12 的 110 端口
ufw allow from 17.16.10.2 to 192.168.199.12 port 110
# 允许 192.168.1.0/24 网段的 tcp 包访问本机的 25 端口
ufw allow proto tcp from 192.168.1.0/24 to any port 25
服务的运行级别
# 查看服务的运行级别,以图形化的方式
sysv-rc-conf
# 查看服务的运行级别,以列表的方式
sysv-rc-conf --list
# 设置服务在所有运行级别下自启动/关闭自启
sysv-rc-conf [服务名称] on|off
# 设置服务在指定的运行级别下自启动/关闭自启
sysv-rc-conf --level [运行级别] [服务名称] on|off
######### 案例 #########
# 查看 ssh 服务的运行级别
sysv-rc-conf --list | grep ssh
# 更改 ssh 服务在运行级别 5 的状态为关闭自启
sysv-rc-conf --level 5 ssh off
# 更改 ufw 服务在所有的运行级别为自启动
sysv-rc-conf ufw on
动态监控进程
# 动态监控进程
top
######### 交互操作 #########
d 指定top命令每隔几秒更新(默认是3秒)
i 不显示任何闲置或僵死进程
u 仅显示指定用户的线程
k 终止指定PID的线程
P 以CPU使用率排序
M 以内存使用率排序
N 以PID排序
q 退出top
查看网络情况
# -a 查看所有
# -n 显示ip地址,而不是域名
# -p 显示PID
# 查看网络情况
netstat -anp
Shell编程
注意事项
1) 脚本开头为 #!/bin/bash
2) 脚本需要有 x 执行权限
执行
# 脚本在当前目录下
./脚本名称.sh
sh ./脚本名称.sh
# 脚本不在当前目录下
/home/脚本名称.sh
sh /home/脚本名称.sh
变量
1) 变量名称可以由字母、数字、下划线组成,但不能以数字开头
2) 等号两侧不能有空格
3) 变量名称一般习惯为大写
# 定义变量
变量名=值
# 撤销变量
unset 变量名
# 定义静态变量(不能被 unset 撤销)
readonly 变量名
# 使用变量(系统变量和用户自定义变量都可以这样使用)
$变量名
${变量名}
# 将命令执行后的结果赋值给变量
变量名=`命令`
变量名=$(命令)
#!/bin/bash
# 变量
echo "PATH=$PATH"
echo "USER=$USER"
A=0
echo "A=$A"
unset A
readonly B=2
echo "B=$B"
#unset B
USER_HOME_LIST=`ls -lh ~`
echo "当前用户的目录内容:"
echo "$USER_HOME_LIST"
ROOT_HOME_LIST=$(ls -lh /root)
echo "root用户的目录内容:"
echo "$ROOT_HOME_LIST"
环境变量
# 将变量导出,使其成为环境变量
export 变量名=值
# 让修改后的配置文件立即生效
source 配置文件
#!/bin/bash
export MY_ENV="aaa"
echo "MY_ENV=$MY_ENV"
注释
# 单行注释
:<<!
多行注释
!
位置参数变量
$n 功能描述:n为数字,$0代表命令本身,$1-$9代表第一到第九个参数,十以上的参数需要用大括号包含,如${10}
$* 功能描述:代表除命令本身的所有参数,会把这些参数当作一个整体看待
$@ 功能描述:代表除命令本身的所有参数,不过会把这些参数区分对待
$# 功能描述:代表除命令本身的所有参数的个数
#!/bin/bash
echo "命令本身:$0"
echo "第一个参数:$1"
echo "第二个参数:$2"
echo "整体:$*"
echo "区别对待:$@"
echo "参数个数:$#"
预定义变量
$$ 功能描述:当前进程的进程号
$! 功能描述:后台正在运行的最后一个进程的进程号
$? 功能描述:最后一次执行命令的返回状态。为0代表上一个命令正确执行了;非0代表上一个命令执行不正确
#!/bin/bash
echo "当前进程的进程号:$$"
./var_shell.sh &
echo "最后一个进程的进程号:$!"
TEMP=$(ls)
unset TEMP
echo "最后一次执行命令的返回状态:$?"
运算符
# 语法1
$((运算式))
# 语法2
$[运算式]
# 语法3
# 注意:非数值符号的左右两边必须要有空格
# \* 乘号
# / 除号
# % 取余
# \( 左括号
# \) 右括号
expr 运算式
#!/bin/bash
echo "(2+3)*4=?"
A=$(((2+3)*4))
echo "语法1:$A"
B=$[(2+3)*4]
echo "语法2:$B"
C=`expr \( 2 + 3 \) \* 4`
echo "语法3:$C"
echo "两个参数之和:$[$1+$2]"
条件判断
if
# 语法
# 注意:条件前后要有空格
if [ 条件 ] && [ 条件 ]
then
要执行的语句
elif [ 条件 ] || [ 条件 ]
then
要执行的内容
else
要执行的内容
fi
# 非空返回true,可以使用 $? 验证(0为true,非0为false)
# [ "aaa" ] 返回true
# [ ! "aaa" ] 返回false
# [] 返回false
# [ 条件 ] && [ 条件 ] 并且
# [ 条件 ] || [ 条件 ] 或者
# [ 条件 ] && echo ok || echo notOk 条件满足,执行后面的语句
######### 常用判断条件 #########
! 取反
= 字符串/数值之间的比较
-lt 小于
-le 小于等于
-gt 大于
-ge 大于等于
-ne 不等于
# 文件权限
-r 有读的权限
-w 有写的权限
-x 有执行的权限
# 文件类型
-e 文件存在
-f 文件存在,且是一个常规的文件
-d 文件存在,且是一个目录
#!/bin/bash
if [ "ok" = "ok" ]
then
echo "ok等于ok"
fi
if [ 23 -ge 22 ]
then
echo "23大于等于22"
fi
if [ -e /root/install.log ]
then
echo "/root/install.log存在"
fi
echo "分数判断"
if [ $1 -ge 90 ] && [ $1 -le 100 ]
then echo "A"
elif [ $1 -ge 80 ] && [ $1 -lt 90 ]
then echo "B"
elif [ $1 -ge 70 ] && [ $1 -lt 80 ]
then echo "C"
elif [ $1 -ge 60 ] && [ $1 -lt 70 ]
then echo "D"
else echo "E"
fi
case
# | 或者
# [] 范围(与正则表达式的范围一致)
# ;; 相当于break
# *) 相当于default
case $变量名 in
值1 | 值2)
如果变量的值为值1或值2,则执行语句
;;
[值3])
如果变量的值在范围值3中,则执行语句
;;
*)
如果变量的值都不是以上的值,则执行该语句
;;
esac
#!/bin/bash
case $1 in
"0" | "7")
echo "周日"
;;
"1")
echo "周一"
;;
"2")
echo "周二"
;;
"3")
echo "周三"
;;
"4")
echo "周四"
;;
"5")
echo "周五"
;;
"6")
echo "周六"
;;
*)
echo "其他"
;;
esac
流程控制
for
# 语法1
for 变量 in 值1 值2 值3...
do
要执行的语句
done
# 语法2
for((初始值;循环条件;变量变化))
do
要执行的语句
done
#!/bin/bash
for VAR_TEMP in "$*"
do
echo "命令行输入的参数:$VAR_TEMP"
done
echo "======================"
for VAR_TEMP in "$@"
do
echo "参数:$VAR_TEMP"
done
#!/bin/bash
SUM=0
for ((i=1;i<=100;i=$[$i+1]))
do
SUM=$[$SUM+$i]
done
echo "从1加到100的结果:$SUM"
unset SUM
while
while [ 条件 ]
do
要执行的语句
done
#!/bin/bash
SUM=0
I=0
while [ $I -le $1 ]
do
SUM=$[$SUM+$I]
I=$[$I+1]
done
echo "1+...+$1的结果为:$SUM"
unset I
unset SUM
读取控制台输入
# -p 在尝试读取之前输出 PROMPT 提示符并且不带
# -t 如果在 TIMEOUT 秒内没有读取一个完整的行则超时并且返回失败
read -p "提示文本" -t 秒数 变量名
#!/bin/bash
read -p "请输入一个数字:" NUM1
echo "你输入的数字:$NUM1"
TIMEOUT=10
read -p "请继续输入一个数字($TIMEOUT秒内输入):" -t $TIMEOUT NUM2
echo "您输入的数字:$NUM2"
路径剥离
# 从路径中剥离目录和后缀(获取文件名)
# 如果后缀存在,则去除;不存在则不去除
basename [路径] [后缀]
# 从路径中去除最后一个文件名或目录
dirname [路径]
自定义函数
# 声明函数
function 函数名()
{
要执行的语句
return 整数(0为执行成功,其他均为失败)
}
# 调用
函数名 [入参1] [入参2] ...
#!/bin/bash
function getSum()
{
SUM=$[$N1+$N2]
echo "结果:$SUM"
return 0
}
read -p "请输入第一个数字:" N1
read -p "请输入第二个数字:" N2
getSum $N1 $N2
案例
1) 每天凌晨 2:10 备份数据库 test_cloud 到 /data/backup/db
2) 备份开始和备份结束能够给出相应的提示信息
3) 备份后的文件要求以备份时间为文件名,并打包成 .tar.gz 格式,比如:2018-03-12_230201.tar.gz
4) 在备份的同时,检查是否存在10天前的备份文件,如果有就将其删除
#!/bin/bash
echo ""
echo "==================== 备份开始 ===================="
echo ""
# 备份路径
BACKUP_PATH="/data/backup/db"
# 备份的文件名
BACKUP_FILENAME="$(date "+%Y-%m-%d_%H%M%S")"
# 备份文件路径
BACKUP_FILE_PATH="${BACKUP_PATH}/${BACKUP_FILENAME}"
# 判断临时备份目录是否存在,若不存在则创建
if [ ! -e "${BACKUP_FILE_PATH}/" ]
then
mkdir -p "${BACKUP_FILE_PATH}/"
fi
# 数据库服务器域名/ip地址
DATABASE_HOSTNAME="localhost"
# 端口号
DATABASE_PORT=3306
# 用户名
DATABASE_USERNAME="root"
# 密码
DATABASE_PASSWORD="root"
# 数据库名称
DATABASE_NAME="test_cloud"
# 备份数据库
# 将sql通过gzip进行压缩,然后将压缩后的数据写入到 .sql.gz 文件中
mysqldump -h${DATABASE_HOSTNAME} -P${DATABASE_PORT} -u${DATABASE_USERNAME} -p${DATABASE_PASSWORD} ${DATABASE_NAME} | gzip > "${BACKUP_FILE_PATH}/${BACKUP_FILENAME}.sql.gz"
# 打包
cd "${BACKUP_PATH}"
tar -zcvf "${BACKUP_FILENAME}.tar.gz" "${BACKUP_FILENAME}/"
# 删除文件夹
rm -rf "${BACKUP_FILENAME}/"
# 如果存在10天前的备份文件,则删除
find "${BACKUP_PATH}" -mtime +10 -name "*.tar.gz" -exec rm -f {} \;
echo ""
echo "备份的文件:${BACKUP_FILE_PATH}.tar.gz"
echo "==================== 备份结束 ===================="
echo ""
MySQL
连接
mysql -h主机名 -P端口号 -u用户名 -p密码
备份数据库
# 将数据库的完整SQL打印到当前控制台窗口
mysqldump -h主机名 -P端口号 -u用户名 -p密码 数据库名