Linux文件系统的目录结构

Linux中一切皆文件。/是Linux的根目录。

image-20230912200146346

  • bin:存入Linu的一些命令,实际存放在usr/bin,根目录下的bin是一个链接
  • etc :存放系统管理所需要的一些配置文件。
  • opt:系统提供给存放第三方资源的地方。

学习Linux常用:

1
2
3
4
5
6
# 清空屏幕
clear
# 显示命令历史记录
history
# tag键自动补全
# 上键。显示上一个操作的命令。下键同理

系统管理

关机重启

  • 关机
1
2
3
4
5
6
7
8
# 默认一分钟后关机。(shutdown 3)3分钟后关机。(shutdown 15.28)15点28分钟关机。
shutdown
# 取消关机
shutdown -c
# 立刻关机
shutdown now
# 重启
shutdown -r now
  • 重启
1
reboot
  • 将数据由内存同步到硬盘中
1
sync

Linux中的进程和服务

计算机中,一个正在执行的程序或命令,叫做进程(process)。

启动之后一只存在、常驻内存的进程,一般被称做服务。

systemctl

  • 基本语法:

    start:启动服务

    stop:关闭服务

    restart:重启服务

    status:查看服务状态

    enable:开机自启动

    disable:关闭开机自启动

1
systemctl start|stop|restart|status|enable|disable 服务名

了解:

CenOS6是service 服务名 start|stop|restart|status

  • 关闭、开启防火墙开机自启动
1
2
3
4
# 关闭
systemctl disable firewalld
# 开启
systemctl enable firewalld

VIM编辑器

VI和VIM

VI是Unix 操作系统和类Unix操作系统中最通用的文本编辑器。
VIM编辑器是从VI发展出来的一个性能更强大的文本编辑器。可以主动的以字体颜色辨别语法的正确性,方便程序设计。VIM 与VI编辑器完全兼容。

  • 打开文件:
1
vim 文件名

一般模式、编辑模式、命令模式

打开文件后都是一般模式,一般模式都是进行一些删除、复制、粘贴。按下aio进入编辑模式。这个时候就可以输入内容。

进入编辑模式后,按esc退出编辑模式,进入一般模式。

一般模式下输入:进入命令模式。

一般模式

语法 说明
yy 复制光标当前一行
y 数字 y 复制一段,从光标当前行到后n行
p 在光标所在行的下一行进行粘贴
u 撤销上一步
dd 删除所在行
d 数字 d 删除光标含后n行
x 剪切一个字符
v 可视化,按下上面的按键后实现相应效果。配合ydxp使用更好。
gg 跳到行头
G(shift+g) 跳到行尾
数字+G 跳到指定行

命令模式

命令 说明
:w 保存
:q 退出。在修改完文件后,退出后,文件未保存更改,加!强制退出。:q!
:wq 保存并退出。加!强制保并存退出。:wq!
:set nu 文档显示行号。
:set nonu 文档不显示行号。
/要查找的词 查找所有符合的词,光标跳转到第一个词的位置,n切换到下一个词
N(shift+n)切换到上一个词
:noh 去掉高亮显示
:s/old/new 替换当前行匹配到的第一个old为new
:s/old/new/g 替换当前行匹配到的所有old为new
:%s/old/new 替换文档中每一行匹配到的第一个old为new
:%s/old/new/g 替换文档中匹配到的所有old为new

网络配置

  • 查看网络:
1
ip addr

windows是ipconfig。

  • 查看网络是否连通

    查看本机是否和百度能连通

1
ping www.baicu.com

修改静态ip

  • 修改配置文件
1
vim /etc/sysconfig/network-scripts/ifcfg-ens33
image-20230912235325831 image-20230912235354224

修改配置文件。将BOOTPROTO配置成static

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
TYPE="Ethernet"
PROXY_METHOD="none"
BROWSER_ONLY="no"
# 修改dhcp为static
BOOTPROTO="static"
DEFROUTE="yes"
IPV4_FAILURE_FATAL="no"
IPV6INIT="yes"
IPV6_AUTOCONF="yes"
IPV6_DEFROUTE="yes"
IPV6_FAILURE_FATAL="no"
IPV6_ADDR_GEN_MODE="stable-privacy"
NAME="ens33"
UUID="a0bc396a-a1a4-4687-9de2-12dd6d1ddb9f"
DEVICE="ens33"
ONBOOT="yes"
# IP地址
IPADDR=192.168.200.100
# 网关
GATEWAY=192.168.200.2
# 域名解析器
DNS1=192.168.200.2
  • 重启网络服务
1
service network restart
  • 测试网络是否连通
1
2
3
ip addr
ping www.baidu.com
ping PC主机地址

修改主机名

  • 查看当前主机的主机名
1
hostname
  • 修改当前主机的主机名
1
2
3
4
# 修改后重启后生效
vim /etc/hostname
# 方式二:
hostnamectl set-hostname linux100
  • 添加ip地址和主机名的映射
1
vim /etc/hosts
1
2
# 添加
192.168.200.100 linux100

远程登陆

1
ssh root@linux100

image-20230913001329552

常用命令

帮助命令

  • man
1
2
# 内嵌命令需要加-f,(man -f 命令名称)
man 命令名称
1
2
# 使用man查看命令文档时用中文显示
sudo yum install man-pages-zh-CN
  • help
1
2
3
4
# 内置命令
help 命令名称
# 外部命令
命令名称 --help
  • 查看命令是否是内嵌命令
1
2
type cd 
type ls

pwd

打印当前的工作目录的绝对路径

1
pwd

image-20230913160920030

cd

切换当前的工作目录

1
2
3
4
5
6
7
cd /etc
# 返回上一级目录
cd ../
# 返回上一次操作的目录
cd -
# 返回主目录
cdcd ~

ls

列出目录内容

  • 基本语法
1
ls [选项] [目录或文件]
选项 说明
-a 列出所有文件,包括隐藏文件
-l 长数据串列出,包括文件的属性与权限等数据;缩写ll
-h 与-l一起使用-lh,以方便阅读的形式显示文件大小

mkdir

创建文件夹

1
2
3
4
5
6
# 创建一个文件夹a
mkdir a
# 在opt目录下创建一个文件夹b
mkdir /opt/b
# 创建多级目录。-p,如果父目录没有,父目录也跟着创建
mkdir -p /opt/a/b/c

rmdir

删除文件夹

1
2
3
4
5
rmdir a
rmdir /opt/b
# 如果目录由多个路径名组成,从最后一个路径名开始依次删除, 直到所有的路径名都被删完。
# 例如:命令'rmdir -p a/b/c'按 照'rmdir /a/b/c'; 'rmdir a/b'; 'rmdir a'的顺序删除目录。
rmdir -p /a/b/c

touch

1
2
# 创建一个空文件
touch /opt/a.txt

vim也可以创建一个文件,wq保存出来即可

cp

复制文件或目录

  • 基本语法:
1
cp [选项] 源文件 目标文件
  • 选项:

    -r:递归复制整个文件夹。

如果是覆盖文件。cp会进行提示,如果不想要提示,可以在cp前面加个反斜杠\cp

rm

删除文件或目录

  • 基本语法:
1
rm [选项] 目标文件或目录
  • 选项
选项 说明
-r 递归删除目录中所有内容
-f 强制执行删除操作,而不用进行确认
-v 显示指令的详细执行过程

慎用!!!!rm -rf /*

mv

移动目录或者文件,也可进行重命名。

1
2
3
4
# 把/opt/a.txt文件移动到/下面
mv /opt/a.txt /
# 把/opt/a.txt文件移动到/下面并重命名
mv /opt/a.txt /b.txt

cat

查看文件内容。

  • 选项

    -n:显示所有行行号,包括空行。

1
cat /opt/a.txt

对于特别大的文件可以用less 文件名

echo

输出内容到控制台。

1
2
# -e支持转义
echo "hello\nworld"

>输出重定向和>>追加

1
2
3
4
# 列表内容写入到文件中(覆盖写)
ls -l > a.txt
# 列表内容追加到文件中
ls -l >> a.txt
1
echo -e "hello\nworld" >> a.txt

head和tail

head:显示文件前n行。默认n=10

tail:显示末尾后n行。默认n=10

1
2
3
4
# 显示前10行
head a.txt
# 显示前20行
head -n 20 a.txt
1
2
# tail有个-f,表示实时跟踪,显示文件最新追加的内容,监视文件变化。
tail -n 200 -f a.txt

ln

添加一个软链接。类似与windows里面的快捷方式。

1
ln -s /opt myetc

时间日期类

基本语法:

1
date [选项] [参数]
1
2
# 显示当前时间
date
  • 选项

    • -d:显示指定时间的“时间字符串”表示的时间,而非当前时间。
    • -s:设置系统日期时间。
  • 参数:

    • date:显示当前时间

    • date +%Y:显示当前年份

    • date +%m:显示当前月份

    • date +%d:显示当前是那一天

    • date "+%Y-%m-%d %H:%M:%S":显示年月日时分秒

image-20230913200844788

date +%s:显示当前日期的时间戳

非当前时间

1
2
3
4
5
6
# 显示前一天的时间
date -d '1 days ago'
# 显示明天的时间
date -d '-1 days ago'
# 显示后一小时的时间
date -d '-1 hours ago'

查看日历

1
2
3
4
# 查看当前月份日历
cal
# 查看当前月,前一个月和后一个月的日历
cal -3

用户管理

用户管理命令

useradd 添加用户

  • 基本语法
1
2
3
4
5
6
# 添加一个用户,默认主目录名称是用户名
useradd 用户名
# 添加用户的时候修改主目录名
useradd -d /home/dave david
# 添加新用户到某个组
useradd -g 组名 用户名
image-20230914195133949

passwd 设置密码

  • 基本语法
1
2
# 设置用户密码
passwd 用户名

id 判断用户是否存在

  • 基本语法
1
2
# 查看用户是否存在
id 用户名
  • 查看创建了那些用户
1
cat /etc/passwd

su 切换用户

1
2
# 切换用户
su tony

sudo 设置普通用户具有用户权限

1
2
3
4
5
6
7
8
# 修改配置,让tony临时具有管理员权限
vim /etc/sudoers
root ALL=(ALL) ALL
tony ALL=(ALL) ALL
# 添加NOPASSWD不用输入密码
# # %wheel ALL=(ALL) NOPASSWD: ALL
# 切换tony用户测试
sudo ls /root

userdel 删除用户

1
2
3
4
# 删除用户
userdel tony
# 删除用户的同时删除主目录
userdel -r david

usermod 修改用户

1
2
# 修改用户所属的组
usermod -g 用户组 用户名

用户组管理命令

每个用户都有一个用户组,系统可以对一个用户组中所有用户进行集中管理。不同的Linux系统对用户组的规定有所不同。

如Linux下的用户属于与它同名的组,这个用户组在创建用户时同时创建。

groupadd 新增组

1
2
# 添加一个组
groupadd 组名

groupmod 修改组

1
2
# 修改组名
groupmod -n haircut meifa

groupdel 删除组

1
groupdel tony

查看所有组

1
cat /etc/passwd

文件权限类

Linux系统是一种典型的多用户系统,不同的用户处于不同的地位,拥有不同的权限。

为了保证系统安全性,Linux系统对不同的用户访问同一个文件(包括目录文件)的权限做了不同的规定。

在Linux中我们可以用ls -l命令来显示一个文件的属性及文件所属的用户和组。

image-20230914210236653
  • rwx,如果没有权限用-表示。

  • 文件类型中d表示目录,-表示文件,l表示链接

image-20230914212226658

文件权限后面的1

  • 如果查看到的是文件:则指的是硬链接的个数。
  • 如果查看的是文件夹:则指的是子文件夹的个数。

chmod 改变权限

image-20230914212749691

u:所有者,g:所有组,o:其他人,a:所有人

  • 方式一:
1
2
3
4
5
6
chmod [{u|g|o|a}{+|-|=}{rwx}] 文件或目录
# 示例:
chmod u+rwx a.txt
# 给a.txt文件添加所有权限
chmod a+rwx a.txt
chmod ugo+rwx a.txt
  • 方式二:

r占比4,w占比2,x占比1

1
2
3
4
# 给a.txt的属主,属组添加rx权限
chmod 550 a.txt
# 给a.txt添加所有权限
chmod 777 a.txt
  • 修改整个文件夹下面的所有文件的方式

    -R:递归方式

1
chmod -R 777 xiyou/

chown改变所有者

  • 基本语法:

    -R:递归方式

1
chwon 属主 文件名

chgrp 改变所属组

  • 基本语法:

    -R:递归方式

1
charp 属组 文件名

搜索查找类

find 查找文件或目录

  • 基本语法:
1
find [搜索范围] [选项]
选项 说明
-name<查询方式> 安装指定的文件名查找文件
-user<用户名> 查找指定用户名所有文件
-size<文件大小> 安装指定的文件大小查找文件,单位为:
b——块(512个字节)
c——字节
w——字(2字节)
k——千字节
M——兆字节
1
2
3
4
# 按文件名
find /root -name *.txt
# 按大小
find /root -size +10M

locate快速定位文件路径

由于locate指令是基于数据库进行查询,第一次运行前,必须使用updatedb指令创建locate数据库。

1
locate 搜索文件
1
2
updatedb
locate a.txt

grep 过滤及|管道符

管道符|,表示将前面命令的处理结果交给后面的命令处理。

1
ls -l | grep test

压缩和解压

gzip/gunzip压缩(了解)

1
2
3
4
# 将文件压缩为*.gz文件
gzip 文件
# 解压缩
gunzip 文件.gz

缺点:

  • 只能压缩文件,不能压缩目录
  • 不保留原来文件
  • 同时多个文件或产生多个压缩包

zip/unzip压缩

  • zip选项

    -r:压缩目录

  • unzip

    -d:指定安装后的目录

1
2
zip [选项] 压缩后的文件名.zip 要压缩的内容
unzip [选项] xxx.zip
1
2
3
# 示例
zip -r myroot /root
unzip myroot -d /opt/a

tar 打包

  • 基本语法
1
tar [选项] XXX.tar.gz 要打包的内容
选项 功能
-c 产生.tar打包文件
-v 显示详细信息
-f 压缩后的文件名
-z 打包同时压缩
-x 解压.tar文件
-C 解压到指定目录
1
2
# 压缩
tar -zcvf temp.tar.gz a.txt b.txt
1
2
# 解压
tar -zxvf temp.tar.gz -C /tmp

磁盘管理

du 查看文件和目录占用磁盘情况

  • 基本语法:
1
du [选项] 目录/文件
选项 功能
-h 以人们更加容易阅读的方式文件大小。
-a 不仅查看子目录大小,还包括文件
-c 显示所有的文件和子目录大小后,显示总和
-s 只显示总和
–max-depth=n 指定统计子目录的深度为第n层
1
2
# 示例
du --max-depth=1 -ah /

df 查看磁盘空间使用情况

  • 基本语法:

    -h:以人们较易阅读的方式显示大小。

1
df 选项

lsblk 查看设备的挂载情况

  • 基本语法:

    -f:查看详细的设备挂载情况,显示文件系统信息。

1
lsblk 查看设备挂载情况

mount/unmount 挂载和卸载

Linux中每个分区都是用来组成整个文件系统的一部分,它在用一种叫做**“挂载”**的处理方法,它整个文件系统中包含了一整套的文件和目录,并将一个分区和一个目录连接起来,要载入的那个分区将它的存储空间在这个目录下获得。

  • 基本语法
1
2
mount [-t 文件系统类型] [-o 选项] 挂载的设备 挂载的目录(挂载点)
umount 设备名或挂载点

image-20230915233711004

示例:

1
2
mount /dev/cdrom /mnt/cdrom
umount /mnt/cdrom

fdisk 分区

  • 查看分区
1
fdisk -l
  • 对新硬盘进行分区
1
fdisk 硬盘设备名

进程管理

计算机中,一个正在执行的程序或命令,叫做进程

启动之后一直存在、常驻内存的进程,一般被称作服务

ps 查看当前系统进程状态

  • 基本语法
1
2
3
4
# 查看系统中所有进程
ps aux | grep xxx
# 可以查看子父进程之间的关系
ps -ef | grep xxx
选项 说明
a 列出带有终端的所有用户进程
x 列出当前用户的所有进程,包括没有终端的进程
u 面向用户友好的显示风格
-e 列出所有进程
-u 列出某个用户关联的所有进程
-f 显示完整格式的进程列表

ps aux信息说明

image-20230918215735260

PID:进程的ID

%CPU:该进程占用CPU资源的百分比,占用越高,进程越耗费资源;

%MEM:该进程占用物理内存的百分百,占用越高,进程越耗费资源;

image-20230918215951056

如果想要查看进程的CPU占用率和内存占用率,可以使用aux。

如果想要查看进程的父子进程ID可以使用ef。(父进程PID,子进程PPID)

kill 终止进程

1
2
3
# -9:表示强制进程立刻关闭
kill [选项] 进程号(PID)
killall 进程名称

慎用killall

top实时监控系统进程状态

  • 基本命令
1
top [选项]
选项 说明
-d 秒数 指定top命令每隔几秒中刷新。默认是3秒钟
-i 使top不显示任何闲置或僵死进程。
-p 通过指定监控进程ID来仅仅监控某个进程的状态。
  • 操作说明
操作 功能
P 以CPU使用率排序,默认就是此项。
M 以内存的使用率排序
N 以PID排序
q 退出top

查看网络状态

  • 基本语法
1
2
3
4
# 查看该进程网络信息
netstat -anp | grep 进程号
# 查看网络端口号的占用情况
netstat -nlp | grep 端口号
选项 功能
-a 显示所有正在监听和未监听的套接字。
-n 拒绝显示的别名,能显示数字的全部转化成数字。
-l 仅列出在监听的服务状态
-p 表示显示那个进程在调用

系统定时任务和软件包管理

定时任务

  • 重新启动crond服务
1
systemctl restart crond
  • 基本语法
1
crontab [选项]
选项 功能
-e 编辑crontab定时任务
-l 查询crontab任务
-r 删除当前用户所有的crontab定时任务

参数说明:

1
crontab -e

进入编辑页面后,会打开vim编辑你的工作。格式:

1
* * * * * 要执行的任务
  • 参数描述

image-20230920184208841

  • 特殊符号

image-20230920184417453

示例

image-20230920184658551

软件包管理

RPM

  • 查询命令
1
2
3
4
# 查询所有安装的软件包
rpm -qa
# 查看软件安装包的详细信息
rpm -qi 软件名
  • 卸载
1
2
3
rpm -e 软件包
# -nodeps:不检查依赖关系,之间卸载。不推荐使用
rpm -e --nodeps 软件包
  • 安装

    -i:安装

    -v:显示详细信息

    -h:进度条

    --nodeps:安装前不检查依赖关系

1
2
# 选项
rpm -ivh rpm软件包全名

YUM

基于RPM包管理,能够从指定的服务器自动下载RPM包并且安装,可以自动处理依赖性关系,并且一次安装所有依赖的软件包,无需频繁地一次次下载、安装。

  • 基本语法
1
yum [选项] 参数

选项:

  • -y:对所有提问都回答“yes”

参数

  • list:查看所有软件包

  • install:安装rpm软件包

  • update:更新rmp软件包

  • check-update:检查是否有可用的更新rmp软件包

  • remove:删除指定的软件包

Sheel编程

Sheel是一个命令行解释器,它接收应用程序/用户命令,然后调用系统内核。

入门

  • 脚本格式

脚本以#!/bin/bash开头(指定解析器)

运行脚本

  • 方式一

采用bashsh加上脚本的相对路径或绝对路径来执行。

1
2
#!/bin/bash
echo "hello world"
1
2
# 执行命令运行脚本
sh ./hello.sh
  • 方式二

通过给文件加上可执行权限(x),然后通过文件的相对路径绝对路径来执行。

1
2
chmod +x hello.sh 
./hello.sh
  • 方式三

在脚本的路径前加上.或者source。在修改完配置文件后,配置不生效,可以用source命令使配置生效。

1
source ./hello

前两种方式都是在当前shell中打开一个子shell来执行脚本内容,当脚本内容执行结束,则子shell关闭,回到父shell中。

第三种,也就是在脚本路径前面加上.source的方式,可以使脚本内容在当前shell中执行,无需打开子shell。这就是我们修改完/etc/profile文件后要source一下的原因。

开子shell和不开子shell的区别就是,环境变量的继承关系,如在子shell中设置当前变量,父shell中是不可见的。

变量

系统预定义变量

  • 常用系统变量

$HOME,$PWD,$SHELL,$USER

1
2
3
4
5
6
# 查看系统变量的值
echo $HOME
# 显示所有系统变量的值
set
BASH=/bin/bash
BASH=()

自定义变量

  • 基本语法

定义变量:变量名=变量值,注意,=号前后不能有空格

撤销变量:unset 变量名

声明静态变量(只读变量): readonly变量。注意:不能unset

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
a=2
echo $a
my_var='hello world'
echo $my_var
# 导出成全局变量。不到出的话,除非用source执行脚本,否则用前两种方式执行脚本都是进入子bash执行
export my_var
# 进入子bash
bash
# 发现可以看到my_var变量
echo $my_var
# 退出子bash
exit
# 撤销变量
unset a
unset my_myvar
  • 定义变量名规则
    1. 变量名可以以字母、数字和下划线组成,但是不能以数字开头,环境变量名建议大写
    2. 等号两边不能有空格
    3. 在bash中默认类型都是字符串,无法直接进行数值计算
    4. 如果变量的值有空格,需要用双引号或单引号括起来。

特殊变量

$n

n为数字$0为该脚本的名称,$1为第一个参数,$2为第二个参数,如果超过10个参数,大于10以上的参数要用{}括起来,则用${10}表示。

1
2
3
4
5
6
#!/bin/bash
echo "====$0====="
echo "hello,$1"

# 执行脚本
./hello.sh xiaoming

$#

获取我们所有输入参数的个数,常用于循环,判断参数个数是否正确,加强脚本健壮性。

$*、$@

$*:这个变量代表命令行中所有的参数,$把所有的参数看成一个整体

$@:这个变量也代表命令行中所有的参数,不过$@把每个参数区分对待

$?

最后一次执行的命令返回状态,如果这个变量值为0,证明上一个命令正确执行;如果这个变量为非0,则证明上一个命令执行不正确。

1
2
./hello.sh
echo $?

运算符

  • 基本语法

$((运算式))$[运算式]

1
2
echo $[5*2]
echo $((5*2))
1
2
3
4
5
6
# 三种方式赋值给变量a
a=$[5*2]
a=$(expr 5 \* 2)
a=`expr 5 \* 2`
# 输出
echo $a

条件判断

  • 基本语法

    1. test condition
    2. [ condition ][]前后需要有空格
  • 两个数之间的判断

格式 说明
-eq 等于
-ne 不等于
-gt 大于
-lt 小于
-ge 大于等于
-lt 小于等于
  • 按文件权限进行判断
格式 说明
-r 有读的权限
-w 有写的权限
-x 有可执行的权限
  • 按文件类型进行判断
格式 说明
-e 文件存在
-f 文件存在,并且是一个常规文件。file
-d 文件存在,并且是一个目录,directory
1
2
3
4
5
6
7
8
9
10
# 字符串的比较
a=hello
[ $a = hello ]
echo $?
# 数字的比较
[ 2 -ge 3]
echo $?
# 判断文件是否有读权限
[ -r ./hello.sh]
echo $?

多条件判断

&&表示上一条命令执行成功后才执行下一条命令

||表示上一条命令执行失败后才执行下一条命令

1
[  ] || echo OK || echo Not OK

如果在同一个中括号中,与用-a,或用-o

1
if [ $a -ge 25 -a $a -le 35 ]; then echo OK; fi

流程控制

if 判断

  • 单分支
1
2
3
4
5
6
7
8
if [ 条件判断式 ];then
程序
fi
# 或
if [ 条件判断式 ]
then
程序
fi
  • 多分支
1
2
3
4
5
6
7
8
9
if [ 条件判断式 ]
then
程序
elif [ 条件判断式 ]
then
程序
else
程序
fi

示例:

1
2
3
4
5
6
7
#!/bin/bash
if [ $1 = atguigu ]
then
echo OK
else
echo Not OK
fi
1
2
3
chmod +x ./streq.sh
a=atguigu
./streq.sh $a

case语句

  • 基本语法
1
2
3
4
5
6
7
8
9
10
11
case $变量名 in
"值1")
如果变量的值=1,则执行程序1
;;
"值2")
如果变量的值=2,则执行程序2
;;
*)
如果变量的值都不是以上值,则执行该程序
;;
esac
image-20230921231838044

for循环

  • 基本语法1
1
2
3
4
for((初始值;循环控制条件;变量变化))
do
程序
done
1
2
3
4
5
6
7
8
#!/bin/bash

sum=0
for((i=0;i<100;i++))
do
sum=$[ $sum + $i ]
done
echo $sum
  • 语法二
1
2
3
4
for 变量 in 值1 值2 值3...
do
程序
done
1
for i in {1..100};do sum=$[$sum+$i];done; echo $sum

while 循环

  • 基本语法
1
2
3
4
while [ 条件判断式 ]
do
程序
done

image-20230923001034293

read 读取控制台输入

read (选项) (参数)

选项:

-p:指定读取值时的提示符。

-t:指定读取值时等待的时间(秒)如果-t不加表示一直等待。

参数:

变量:指定读取值的变量名

1
2
3
4
5
6
7
#!/bin/bash
read -t 10 -p "请输入您的芳名:" name
echo "welcome,$name"

./read_test.sh
# 请输入您的芳名:atguigu
# welcome,atguigu

函数

系统函数

basename

  • 基本语法
1
basename [string/pathname] [suffix]

basename命令会删掉所有前缀包括最后一个/的字符,然后将字符串显示出来。

basename可以理解为取路径里的文件名称出来。

选项:

suffix为后缀,如果后缀指定了,会把文件名的后缀也去掉

1
2
3
4
basename /home/par.sh
# par.sh
basename /home/par.sh .sh
# par

dirname

dirname:文件的绝对路径。从给定的包含绝对路径的文件名中除去文件名部分,返回路径目录部分

1
2
3
4
basename /home/par.sh
# /home
basename ../par.sh
# ../
1
echo script name: $(cd $(dirname $0); pwd)

自定义函数

  • 基本语法
1
2
3
4
5
6
# 参数列表
[function] funname[()]
{
程序
[return int;]
}

image-20230923205023146

练习

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
#!/bin/bash

# 存放路径
dir="/mysql/dump/"
separator="/"
# 现在日期
year="$(date "+%Y")$separator"
month="$(date "+%m")$separator"
days="$(date "+%d")$separator"
# 60天前
oldYear="$(date -d "61 days ago" "+%Y")$separator"
oldMonth="$(date -d "61 days ago" "+%m")$separator"
oldDays="$(date -d "61 days ago" "+%d")$separator"

# 创建文件夹,[]前后需有空格
if [ ! -d $dir$year$month$days ]
then
mkdir -p $dir$year$month$days
fi

# 删除60天前的备份文件
if [ -d $dir$oldYear$oldMonth$oldDays ]
then
rm -rf $dir$oldYear$oldMonth$oldDays
fi