Linux 命令

套路

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密码 数据库名


最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,402评论 6 499
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,377评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,483评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,165评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,176评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,146评论 1 297
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,032评论 3 417
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,896评论 0 274
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,311评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,536评论 2 332
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,696评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,413评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,008评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,659评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,815评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,698评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,592评论 2 353

推荐阅读更多精彩内容