Linux基础命令

Linux的目录结构

image-20240514213712464

  • /,根目录是最顶级的目录了
  • Linux只有一个顶级目录:/
  • 路径描述的层次关系同样适用/来表示
  • /home/itheima/a.txt,表示根目录下的home文件夹内有itheima文件夹,内有a.txt

ls命令

功能:列出文件夹信息

语法:ls [-l -h -a] [参数]

  • 参数:被查看的文件夹,不提供参数,表示查看当前工作目录
  • -l,以列表形式查看
  • -h,配合-l,以更加人性化的方式显示文件大小
  • -a,显示隐藏文件

隐藏文件、文件夹

在Linux中以.开头的,均是隐藏的。

默认不显示出来,需要-a选项才可查看到。

pwd命令

功能:展示当前工作目录

语法:pwd

作用是:输出当前所在的工作目录

cd命令

功能:切换工作目录

语法:cd [目标目录]

参数:目标目录,要切换去的地方,不提供默认切换到当前登录用户HOME目录

HOME目录

每一个用户在Linux系统中都有自己的专属工作目录,称之为HOME目录。

  • 普通用户的HOME目录,默认在:/home/用户名

  • root用户的HOME目录,在:/root

FinalShell登陆终端后,默认的工作目录就是用户的HOME目录

相对路径、绝对路径

  • 相对路径,==非==/开头的称之为相对路径

    相对路径表示以当前目录作为起点,去描述路径,如test/a.txt,表示当前工作目录内的test文件夹内的a.txt文件

  • 绝对路径,==以==/开头的称之为绝对路径

    绝对路径从开始描述路径

特殊路径符

  • .,表示当前,比如./a.txt,表示当前文件夹内的a.txt文件
  • ..,表示上级目录,比如../表示上级目录,../../表示上级的上级目录
  • ~,表示用户的HOME目录,比如cd ~,即可切回用户HOME目录

mkdir命令

功能:创建文件夹

语法:mkdir [-p] 参数

  • 参数:被创建文件夹的路径
  • 选项:-p,可选,表示创建前置路径
    • 自动创建不存在的父目录,适用于创建连续多层级的目录

touch命令

功能:创建文件

语法:touch 参数

  • 参数:参数必填,表示要创建的文件路径

cat命令

功能:查看文件内容

语法:cat 参数

  • 参数:被查看的文件路径

more命令

功能:查看文件,可以支持翻页查看

语法:more 参数

  • 参数:被查看的文件路径
  • 在查看过程中:
    • 空格键翻页
    • q退出查看

cp命令

功能:复制文件、文件夹

语法:cp [-r] 参数1 参数2

  • 参数1,被复制的
  • 参数2,要复制去的地方
  • 选项:-r,可选,复制文件夹使用

示例:

  • cp a.txt b.txt,复制当前目录下a.txt为b.txt
  • cp a.txt test/,复制当前目录a.txt到test文件夹内
  • cp -r test test2,复制文件夹test到当前文件夹内为test2存在

mv命令

功能:移动文件、文件夹

语法:mv 参数1 参数2

  • 参数1:被移动的
  • 参数2:要移动去的地方,参数2如果不存在,则会进行改名

rm命令

功能:删除文件、文件夹

语法:rm [-r -f] 参数...参数

  • 参数:支持多个,每一个表示被删除的,空格进行分隔

  • 选项:-r,删除文件夹使用

  • 选项:-f,强制删除,不会给出确认提示,一般root用户会用到

  • 参数也支持通配符*,用以做模糊匹配

    • text* 匹配以text开头的文件或文件夹
    • *text 匹配text结尾的文件或文件夹
    • *text * 匹配包含text的文件或文件夹

rm命令很危险,一定要注意,特别是切换到root用户的时候。

which命令

功能:查看命令的程序本体文件路径

语法:which 参数

  • 参数:被查看的命令

find命令

功能:搜索文件

语法1按文件名搜索:find 路径 -name 参数

  • 路径,搜索的起始路径

  • 参数,搜索的关键字,支持通配符*, 比如:*test表示搜索任意以test结尾的文件

  • 按文件大小查找:find 起始路径 -size +|-n [KMG]

  • 查找小于10KB的文件:find / -size -10k
    查找小于100MB的文件:find / -size -100mb
    查找大于1GB的文件:find / -size +1GB
    
    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
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71





    ## grep命令

    功能:过滤关键字

    语法:`grep [-n] 关键字 文件路径`

    - 选项-n,可选,表示在结果中显示匹配的行的行号。
    - 参数,关键字,必填,表示过滤的关键字,带有空格或其它特殊符号,建议使用””将关键字包围起来
    - 参数,文件路径,必填,表示要过滤内容的文件路径,可作为内容输入端口



    > 参数文件路径,可以作为管道符的输入



    ## wc命令

    功能:统计

    语法:`wc [-c -m -l -w] 文件路径`

    - 选项,-c,统计bytes数量
    - 选项,-m,统计字符数量
    - 选项,-l,统计行数
    - 选项,-w,统计单词数量
    - 参数,文件路径,被统计的文件,可作为内容输入端口



    > 参数文件路径,可作为管道符的输入



    ## 管道符|

    写法:`|`

    功能:将符号左边的结果,作为符号右边的输入

    示例:

    `cat a.txt | grep itheima`,将cat a.txt的结果,作为grep命令的输入,用来过滤`itheima`关键字



    可以支持嵌套:

    `cat a.txt | grep itheima | grep itcast`



    ## echo命令

    功能:输出内容

    语法:`echo 参数`

    - 参数:被输出的内容

    - 无需选择,只有一个参数,表示要输出的内容,复杂内容可以用“ "包围

    演示:

    - 在终端上显示:Hello Linux

    echo Hello Linux
    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
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    185
    186
    187
    188
    189
    190
    191
    192
    193
    194
    195
    196
    197
    198
    199
    200
    201
    202
    203
    204
    205
    206
    207
    208
    209
    210
    211
    212
    213
    214
    215
    216
    217
    218
    219
    220
    221
    222
    223
    224
    225
    226
    227
    228
    229
    230
    231
    232
    233
    234
    235
    236
    237
    238
    239
    240
    241
    242
    243
    244
    245
    246
    247
    248
    249
    250
    251
    252
    253
    254
    255
    256
    257
    258
    259
    260
    261
    262
    263
    264
    265
    266
    267
    268
    269
    270
    271
    272
    273
    274
    275
    276
    277
    278
    279
    280
    281
    282
    283
    284
    285
    286
    287
    288
    289
    290
    291
    292
    293
    294
    295
    296
    297
    298
    299
    300
    301

    - 带有空格或\等特殊符号,建议使用双引号包围

    - 因为不包围的话,空格很容易被识别为参数2,尽管echo不受影响



    ## `反引号

    功能:被两个反引号包围的内容,会作为命令执行

    示例:

    - echo \`pwd\`,会输出当前工作目录



    ## tail命令

    功能:查看文件尾部内容

    语法:`tail [-f] 参数`

    - 参数:被查看的文件
    - 选项:-f,持续跟踪文件修改



    ## head命令

    功能:查看文件头部内容

    语法:`head [-n] 参数`

    - 参数:被查看的文件
    - 选项:-n,查看的行数



    ## 重定向符

    功能:将符号左边的结果,输出到右边指定的文件中去

    - `>`,表示覆盖输出 将左侧命令的结果,覆盖写入到符号右侧指定的文件中
    - `>>`,表示追加输出 将左侧命令的结果,追加写入到符号右侧指定的文件中



    ## vi编辑器

    ### 命令模式快捷键

    | 模式 | 命令 | 描述 |
    | ------------ | ----- | --------------------------------- |
    | **命令模式** | `i` | 在当前光标位置进入 `输入模式` |
    | **命令模式** | `a` | 在当前光标位置之后进入 `输入模式` |
    | **命令模式** | `I` | 在当前行的开头进入 `输入模式` |
    | **命令模式** | `A` | 在当前行的结尾进入 `输入模式` |
    | **命令模式** | `o` | 在当前光标下一行进入 `输入模式` |
    | **命令模式** | `O` | 在当前光标上一行进入 `输入模式` |
    | **输入模式** | `esc` | 任何情况下`esc` 都能回到命令模式 |

    ****

    | 模式 | 命令 | 描述 |
    | ------------ | ---------------- | ---------------------- |
    | **命令模式** | `键盘上、键盘k` | 向上移动光标 |
    | **命令模式** | `键盘下、键盘j` | 向下移动光标 |
    | **命令模式** | `键盘左、键盘h` | 向左移动光标 |
    | **命令模式** | `键盘右、键盘l` | 向右移动光标 |
    | **命令模式** | `0` | 移动光标到当前行的开头 |
    | **命令模式** | `$` | 移动光标到当前行的结尾 |
    | **命令模式** | `pageup(Pgup)` | 向上翻页 |
    | **命令模式** | `pagedown(PgDn)` | 向下翻页 |
    | **命令模式** | `/` | 进入搜索模式 |
    | **命令模式** | `n` | 向下继续搜索 |
    | **命令模式** | `N` | 向上继续搜索 |

    | **模式** | 命令 | 描述 |
    | ------------ | ---------- | -------------------------------- |
    | **命令模式** | `dd` | 删除光标所在行的内容 |
    | **命令模式** | `ndd` | n是数字,表示删除当前光标向下n行 |
    | **命令模式** | `yy` | 复制当前行 |
    | **命令模式** | `nyy` | n是数字,复制当前行和下面的n行 |
    | **命令模式** | `p` | 粘贴复制的内容 |
    | **命令模式** | `u` | 撤销修改 |
    | **命令模式** | `ctrl + r` | 反向撤销修改 |
    | **命令模式** | `gg` | 跳到首行 |
    | **命令模式** | `G` | 跳到行尾 |
    | **命令模式** | `dG` | 从当前行开始,向下全部删除 |
    | **命令模式** | `dgg` | 从当前行开始,向上全部删除 |
    | **命令模式** | `d$` | 从当前光标开始,删除到本行的结尾 |
    | **命令模式** | `d0` | 从当前光标开始,删除到本行的开头 |





    ### 底线命令快捷键

    ![image-20240514212954898](./Linux/image-20240514212954898.png)



    ## 命令的选项

    我们学习的一系列Linux命令,它们所拥有的选项都是非常多的。

    比如,简单的ls命令就有:-a -A -b -c -C -d -D -f -F -g -G -h -H -i -I -k -l -L -m -n -N -o -p -q -Q -r-R -s -S -t -T -u -U -v -w -x -X -1等选项,可以发现选项是极其多的。

    课程中, 并不会将全部的选项都进行讲解,否则,一个ls命令就可能讲解2小时之久。

    课程中,会对常见的选项进行讲解, 足够满足绝大多数的学习、工作场景。



    ### 查看命令的帮助

    可以通过:`命令 --help`查看命令的帮助手册

    ![image-20240514213545358](./Linux/image-20240514213545358.png)

    ### 查看命令的详细手册

    可以通过:`man 命令`查看某命令的详细手册

    ![image-20240514213539751](./Linux/image-20240514213539751.png)





    # Linux常用操作

    ## 软件安装

    - CentOS系统使用:
    - yum [install remove search] [-y] 软件名称
    - install 安装
    - remove 卸载
    - search 搜索
    - -y,自动确认
    - Ubuntu系统使用
    - apt [install remove search] [-y] 软件名称
    - install 安装
    - remove 卸载
    - search 搜索
    - -y,自动确认

    > yum 和 apt 均需要root权限



    ## systemctl

    功能:控制系统服务的启动关闭等

    语法:`systemctl start | stop | restart | disable | enable | status 服务名`

    - start,启动
    - stop,停止
    - status,查看状态
    - disable,关闭开机自启
    - enable,开启开机自启
    - restart,重启



    ## 软链接

    功能:创建文件、文件夹软链接(快捷方式)

    语法:`ln -s 参数1 参数2`

    - 参数1:被链接的
    - 参数2:要链接去的地方(快捷方式的名称和存放位置)



    ## 日期

    语法:`date [-d] [+格式化字符串]`

    - -d 按照给定的字符串显示日期,一般用于日期计算

    - 格式化字符串:通过特定的字符串标记,来控制显示的日期格式
    - %Y 年%y 年份后两位数字 (00..99)
    - %m 月份 (01..12)
    - %d 日 (01..31)
    - %H 小时 (00..23)
    - %M 分钟 (00..59)
    - %S 秒 (00..60)
    - %s 自 1970-01-01 00:00:00 UTC 到现在的秒数



    示例:

    - 按照2022-01-01的格式显示日期

    ![image-20240514213528329](./Linux/image-20240514213528329.png)

    - 按照2022-01-01 10:00:00的格式显示日期

    ![image-20240514213523029](./Linux/image-20240514213523029.png)

    - -d选项日期计算

    ![image-20240514213518516](./Linux/image-20240514213518516.png)

    - 支持的时间标记为:

    ![image-20240514213514134](./Linux/image-20240514213514134.png)





    ## 时区

    修改时区为中国时区

    ![image-20221027220554654](https://image-set.oss-cn-zhangjiakou.aliyuncs.com/img-out/2022/10/27/20221027220554.png)



    ## ntp

    功能:同步时间

    安装:`yum install -y ntp`

    启动管理:`systemctl start | stop | restart | status | disable | enable ntpd`



    手动校准时间:`ntpdate -u ntp.aliyun.com`



    ## ip地址

    格式:a.b.c.d

    - abcd为0~255的数字



    特殊IP:

    - 127.0.0.1,表示本机
    - 0.0.0.0
    - 可以表示本机
    - 也可以表示任意IP(看使用场景)



    查看ip:`ifconfig`



    ## 主机名

    功能:Linux系统的名称

    查看:`hostname`

    设置:`hostnamectl set-hostname 主机名`



    ## 配置VMware固定IP

    1. 修改VMware网络,参阅PPT,图太多

    2. 设置Linux内部固定IP

    修改文件:`/etc/sysconfig/network-scripts/ifcfg-ens33`

    示例文件内容:

    ```shell
    TYPE="Ethernet"
    PROXY_METHOD="none"
    BROWSER_ONLY="no"
    BOOTPROTO="static" # 改为static,固定IP
    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="1b0011cb-0d2e-4eaa-8a11-af7d50ebc876"
    DEVICE="ens33"
    ONBOOT="yes"
    IPADDR="192.168.88.131" # IP地址,自己设置,要匹配网络范围
    NETMASK="255.255.255.0" # 子网掩码,固定写法255.255.255.0
    GATEWAY="192.168.88.2" # 网关,要和VMware中配置的一致
    DNS1="192.168.88.2" # DNS1服务器,和网关一致即可

ps命令

功能:查看进程信息

语法:ps -ef,查看全部进程信息,可以搭配grep做过滤:ps -ef | grep xxx

kill命令

image-20240514213501448

nmap命令

image-20240514213455076

netstat命令

功能:查看端口占用

用法:netstat -anp | grep xxx

ping命令

测试网络是否联通

语法:ping [-c num] 参数

image-20240514213446601

wget命令

image-20240514213436429

curl命令

image-20240514213428349

image-20240514213422455

top命令

功能:查看主机运行状态

语法:top,查看基础信息

可用选项:

image-20240514213411146

交互式模式中,可用快捷键:

image-20240514213405285

df命令

查看磁盘占用

image-20240514213350037

iostat命令

查看CPU、磁盘的相关信息

image-20240514213341010

image-20240514213334228

sar命令

查看网络统计

image-20240514213316310

环境变量

  • 临时设置:export 变量名=变量值
  • 永久设置:
    • 针对用户,设置用户HOME目录内:.bashrc文件
    • 针对全局,设置/etc/profile

PATH变量

记录了执行程序的搜索路径

可以将自定义路径加入PATH内,实现自定义命令在任意地方均可执行的效果

$符号

可以取出指定的环境变量的值

语法:$变量名

示例:

echo $PATH,输出PATH环境变量的值

echo ${PATH}ABC,输出PATH环境变量的值以及ABC

如果变量名和其它内容混淆在一起,可以使用${}

压缩解压

压缩

tar -zcvf 压缩包 被压缩1...被压缩2...被压缩N

  • -z表示使用gzip,可以不写

zip [-r] 参数1 参数2 参数N

image-20240514213306989

解压

tar -zxvf 被解压的文件 -C 要解压去的地方

  • -z表示使用gzip,可以省略
  • -C,可以省略,指定要解压去的地方,不写解压到当前目录

unzip [-d] 参数

image-20240514213259749

su命令

切换用户

语法:su [-] [用户]

image-20240514213251660

sudo命令

image-20240514213246030

比如:

1
itheima ALL=(ALL)       NOPASSWD: ALL

在visudo内配置如上内容,可以让itheima用户,无需密码直接使用sudo

chmod命令

修改文件、文件夹权限

语法:chmod [-R] 权限 参数

  • 权限,要设置的权限,比如755,表示:rwxr-xr-x

    image-20240514213237881

  • 参数,被修改的文件、文件夹

  • 选项-R,设置文件夹和其内部全部内容一样生效

chown命令

修改文件、文件夹所属用户、组

语法:chown [-R] [用户][:][用户组] 文件或文件夹

image-20240514213227133

用户组管理

image-20240514213217206

用户管理

image-20240514213144475

genenv命令

  • getenv group,查看系统全部的用户组

    image-20240514213133464

  • getenv passwd,查看系统全部的用户

    image-20240514213126691

env命令

查看系统全部的环境变量

语法:env

Shell脚本编程

概念

Shell是什么?

  • Shell是一个命令行解释器,它为用户提供了一个向Linux内核发送请求以便运行程序的界面系统级程序,用户可以用Shell来启动,挂起,停止甚至是编写一些程序。看一个示意图

入门案例

  • 脚本要求格式
    • 脚本以 #!bin/bash 开头
    • 脚本执行需要权限
  • 编写第一个Shell脚本
    • 需求说明,新建一个Shell脚本,输出Hello world
1
2
3
4
5
6
7
8
9
10
11
# 创建shell脚本,注意以sh结尾
mkdir hello.sh

# 两种执行方式
# 1. (使用脚本的绝对路径和相对路径)默认root是没有执行权限的,我们要给shell脚本添加x运行权限
chmod u+x hello.sh
# 运行
./hello.sh

# 2. (sh+脚本)使用sh命令直接运行,不需要添加x权限
sh hello.sh

基本语法

  • Shell变量介绍
    • Linux Shell中的变量分为,系统变量和用户自定义变量
    • 系统变量:$HOME、$PWD、$SHELL、$USER等,比如:echo $HOME 等等
    • 显示当前shell中所有变量:set
  • shell变量的定义
    • 定义变量:变量名=值
    • 撤销变量:unset 变量
    • 声明静态变量:readonly变量,注意:不能unset
1
2
3
4
5
6
7
8
9
10
11
# 案例
1. 定义变量A
A=10
echo A=$A => A=100
2. 撤销变量A
unset A
echo A=$A => A=
3. 声明静态变量B=2,不能unset
readonly B=2
echo B=$B => B=2
4. 可把比那辆提升为全局环境变量,可供其他shell程序使用[该案例后面将]

注意:

image-20240515090101325

设置环境变量

  • 基本语法
    • export 变量名=变量值:将shell变量输出为环境变量/全局变量
    • source 配置文件:让修改后的配置信息立即生效
    • echo $变量名:查询环境变量的值

案例:

1
2
3
4
5
6
7
8
9
1. 在/etc/profile文件中定义TOMCAT_HOME环境变量
1> vim /etc/profile 进入vim编辑器
2> export TOMCAT_HOME=/opt/tomcat 定义环境变量
3> source /etc/profile 刷新
2. 查看环境变量TOMCAT_HOME的值
echo $TOMCAT_HOME 输出
3. 在另外一个shell程序中使用TOMCAT_HOME
进入另一个shell脚本
echo "tomcat_home=$TOMCAT_HOME"

shell脚本多行注释: :<<! 内容 !

位置参数变量

  • 介绍

    • 当我们执行一个shell脚本时,如果希望获取到命令行的参数信息,就可以使用到位置参数变量,比如: ./myshell.sh 100 200,这个就是一个执行shell的命令行,可以在myshell 脚本中获取到参数信息
  • 基本语法

    • $n :n为数字,$0代表命令本身,$1-$9代表第一到第九个参数,十以上的参数,十以上的参数需要用大括号包含,如${10}
    • $* :这个变量代表命令行中所有的参数,$* 把所有的参数堪称一个整体
    • $@ :这个变量代表命令行中所有的参数,不过$@ 把每个参数区分对待
    • $# :这个变量代表命令行中所有参数的个数

案例:

1
2
3
4
5
6
# 编写一个shell脚本position.sh 在脚本中获取到命令行的各个参数信息
#!/bin/bash
echo "0=$0 1=$1 2=$2"
echo "所有的参数=$*"
echo "$@"
echo "所有的参数个数=$#"

预定义变量

  • 基本介绍

    • 就是shell设计者事先已经定义好的变量,可以直接在shell脚本中使用
  • 基本语法

    • $$ :当前进程的进程号(PID)
    • $! :后台运行的最后一个进程的进程号(PID)
    • $? :最后一次执行的命令的返回状态,如果这个变量的职位0,证明上一个命令正确执行,如果这个变量的值为非0(具体是哪个数,由命令自己来决定),则证明上一个命令执行不正确了

案例:

1
2
3
4
5
6
7
8
# 在一个shell脚本中简单使用一下预定义变量preVar.sh
#!/bin/bash
echo "当前正在运行的进程号id=$$"
# 以后台的方式运行一个脚本,并获取他的进程号
./myshell.sh &
echo "后台运行的最后一个进程号=$!"
echo "最后一次执行的结果=$?"

运算符

  • 基本介绍

    • 学习如何在shell中进行各种运算操作
  • 基本语法

    • “$((运算式))” 或 “$[运算式]” 或者 expr m + n
    • 注意expr 运算符间要有空格,如果希望将expr 的结果赋给某个变量,使用``
    • expr m - n
    • expr \*, /, % 乘、除、取余

案例:

1
2
3
4
5
6
7
8
9
10
11
# 计算(2+3)*4
# 第一种方式
RES1=$(((2+3)*4))
# 第二种方式
RES2=$[(2+3)*4]
# 第三种方式
TEMP=`expr 2 + 3`
RES=`expr $TEMP \* 4`
# 请求出命令行的两个参数[整数] 和 20
SUM=$[$1+$2]
./oper.sh 20 50

条件判断

image-20240515095940187

image-20240515100008957

案例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#案例1. "ok" 是否等于 "ok"
if [ "ok" = "ok" ]
then
echo "equal"
fi
#案例2. 23是否大于等于22
if [ 23 -ge 22 ]
then
echo "大于"
fi
#案例3. /root/shcode/aaa.txt 目录中的文件是否存在
if [ -f /root/shcode/aaa.txt ]
then
echo "存在"
fi

流程控制

if分支

image-20240515103100113

注意:[条件判断式] 中括号和条件判断式之间必须有空格

案例:

1
2
3
4
5
6
7
8
# 请编写一个shell程序,如果输入的参数,大于等于60 则输出"及格了" 如果小于60,则输出 "不及格"
if [ $1 -ge 60 ]
then
echo "及格了"
elif [ $1 -lt 60 ]
then
echo "不及格"
fi

case语句

image-20240515103930040

案例:

1
2
3
4
5
6
7
8
9
10
11
12
13
# 当命令行参数是1时,输出"周一",是2时,就输出"周二",其他情况输出 "other"
case $1 in
"1")
echo "周一"
;;
case $2 in
"2")
echo "周二"
;;
*)
echo "other"
;;
esac

for循环

image-20240515104846827

案例:

1
2
3
4
5
6
7
8
9
10
11
12
13
# 打印命令行输入的参数[这里可以看出$* 和 $@ 的区别]
# $* 会把参数当成一个整体 所以只会输出一句话
# $@ 会把参数区分,所以有几个参数 就输出几句话
for i in "$*/$@"
do
echo "i的值为$i"
# 从1加到100的值输出显示
SUM=0
for (( i=1; i<=$1; i++ ))
do
SUM=$[$SUM+$i]
done
echo "SUM=$SUM"

while循环

image-20240515105936017

案例:

1
2
3
4
5
6
7
8
9
# 从命令中输入一个数n,求1+...+n的值是多少
SUM=0
i=0
while [ $i -gt $1 ]
do
SUM=$[$SUM+$i]
i=$[$i+1]
done
echo "SUM的值=$SUM"

read读取控制台输入

image-20240515110647470

案例:

1
2
3
4
5
6
# 案例1:读取控制台输入一个num值
read -p "请输入一个数num1=" NUM1
echo "你输入的num1=$NUM1"
# 案例2:读取控制台输入一个num值,在10s内输入
read -t 10 -p "请输入一个数NUM1=" NUM1
echo "你输入的num1="$NUM1

函数

basename

  • 函数介绍
    • shell编程和其他语言一样,有系统函数,也可以自定义函数,系统函数中,我们这里就介绍两个

image-20240515111138084

案例:

1
2
3
# 案例1:请返回/home/aaa/test.txt的 "test.txt" 的部分
basename /home/aaa/test.txt => test.txt
basename /home/aaa/test.txt .txt => test

dirname

image-20240515111520036

案例:

1
2
# 案例1:请返回/home/aaa/test.txt 的 /home/aaa
dirname /home/aaa/test.txt

自定义函数

image-20240515111933117

案例:

1
2
3
4
5
6
7
8
9
10
11
# 案例1:计算输入两个参数的和(动态的获取),getSum
function getSum()
{
SUM=$[$1+$2]
echo "和是=$SUM"
}

read -p "请输入一个数字n1=" n1
read -p "请输入一个数字n2=" n2

getSum $n1 $n2

Shell脚本案例

image-20240515132902308

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
26
27
28
29
30
BACKUP=/data/backup/db
# 获取当前时间
DATETIME=$(date +%Y-%m-%d_%H_%M_%S)
echo $DATETIME
# 数据库的地址
HOST=localhost
# 数据库的用户名
DB_USER=root
# 数据库密码
DB_PW=Zikl142857
# 数据库名
DATABASE=raehp

# 创建备份目录
[ ! -d "${BACKUP}/${DATETIME}" ] && mkdir -p "${BACKUP}/${DATETIME}"

# 备份数据库
mysqldump -u${DB_USER} -p${DB_PW} --host=${HOST} -q -R --databases ${DATABASE} | gzip > ${BACKUP}/${DATETIME}/$DATETIME.sql.gz

# 将文件处理成tar.gz
cd ${BACKUP}
tar -zcvf $DATETIME.tar.gz ${DATETIME}

# 删除对应的备份文件
rm -rf ${BACKUP}/${DATETIME}

# 检查是否有10天前的备份数据库文件
find ${BACKUP} -atime +10 -name "*.tar.gz" -exec rm {} \;
echo "备份数据库${DATABASE}成功"