Linux系统相关软件的安装

安装vmware

vmware安装教程https://blog.csdn.net/SoulNone/article/details/126681722

安装CentOS

CentOS安装教程https://blog.csdn.net/SoulNone/article/details/126681722

安装vmtools

VMware Tools安装教程https://blog.csdn.net/weixin_45035342/article/details/126638191

安装XShell

XShell安装教程https://blog.csdn.net/SoloVersion/article/details/123854852

安装XFTP

XFTP安装教程https://blog.csdn.net/weixin_44953395/article/details/112900516

Linux目录结构

目录详情https://www.runoob.com/linux/linux-system-contents.html

vi和vim的使用

使用命令https://www.runoob.com/linux/linux-vim.html

Linux命令大全

Linux命令大全https://www.runoob.com/linux/linux-command-manual.html

运行级别

  • 0关机
  • 1单用户[找回丢失密码]
  • 2多用户状态没有网络服务
  • 3多用户状态有网络服务
  • 4系统未使用保留
  • 5图形界面
  • 6系统重启
1
2
3
4
5
6
7
相关文件/etc/inittab
multi-user.target: analogous to runlevel 3 多用户状态有网络服务
graphical.target: analogous to runlevel 5 图形界面

init [0 | 1 | 2 | 3 | 4 | 5 | 6] 指定用户级别
systemctl get-default 获取当前用户级别
systemctl set-default multi-user.target 修改默认的用户级别

用户管理

Linux系统是一个多用户多任务的操作系统任何一个要使用系统资源的用户都必须首先向系统管理员申请一个账号然后以这个账号的身份进入系统

用户登录注销

  1. 登录时尽量少用root帐号登录因为它是系统管理员最大的权限避免操作失误可以利用普通用户登录登录后再用su - 用户名命令来切换成系统管理员身份
  2. 在提示符下输入 logout 即可注销用户
  3. logout 注销指令在图形运行级别无效在 运行级别 3 下有效

添加用户

1
2
3
4
5
6
7
8
useradd 用户名

创建一个用户用户名为king该用户的主目录是/home/test
useradd -d /home/test king

细节注意
1.当创建用户成功后会自动的创建和用户同名的目录目录在home目录下/home/用户名
2.也可以通过 useradd -d 指定目录 新的用户名给新创建的用户指定主目录

用户组

类似于角色系统可以对有共性的多个用户进行统一的管理

  • 新增组
    1
    groupadd 组名
  • 删除组
    1
    groupdel 组名
  • 给用户添加/修改组
    1
    2
    3
    4
    5
    useradd -g 组名 用户名   新建用户并且给用户添加组
    usermod -g 组名 用户名 修改用户的组

    细节注意
    1.新建用户时如果没给用户添加组的话会默认创建一个跟用户名一样名字的组
  • 修改文件/目录所在的组
    1
    2
    3
    chgrp 组名 文件名

    chrop kitty hello.txt
  • 用户和组的相关文件
    • /etc/passwd
      用户的配置文件记录用户的各种信息
      每行的含义 : 用户名:口令:用户标识号:组标识号:注释性描述:主目录:登录Shell
    • /etc/shadow
      口令的配置文件
      每行的含义: 登录名:加密口令:最后一次修改时间:最小时间间隔:最大时间间隔:警告时间:不活动时间:失效时间:标志
    • /etc/group
      组的配置文件记录Linux包含的组的信息
      每行含义 : 组名:口令:组标识号:组内用户列表

修改密码

1
2
3
4
passwd 用户名

细节注意
1.要用root账号或者是要修改密码的用户账号登录才可以修改

删除用户

1
2
3
4
5
6
userdel 用户名         删除用户但是保留用户的主目录
userdel -r 用户名 删除用户和用户的主目录

细节注意
1.使用root账号删除用户
2.一般建议保留用户主目录

切换用户

1
2
3
4
5
su - 用户名 

细节注意
1.从权限高的用户切换到权限低的用户不需要输入密码反之需要
2.当需要返回到原来用户时使用exit或logout指令

修改用户登录的初始目录

1
2
3
4
usermod -d 目录名 用户名

细节注意
1.用户需要有进入到新目录的权限

root密码找回

  1. 首先启动系统进入开机界面在界面中按e进入编辑界面
  2. 进入编辑界面使用键盘上的上下键把光标往下移动我到以liux16开头内容所在的行数在行的最后面UTF-8后输入init=/bin/sh按Ctrl + x 进入单用户模式
  3. 在光标闪烁的位置中输入mount -o remount,rw / (注意各个单词间有空格)完成后按键盘的回车键
  4. 在新的一行最后面输入: passwd 完成后接键盘的回车键(Enter)输入密码然后再次确认密码即可密码修改成功后会显示 passwd….的样式说明密码修改成功
  5. 输入touch /.autorelabel (注意touh 后面有一个空格)完成后按回车键
  6. 输入exec /sbin/init (注意exec 后面有一个空格)完成后按回车键等待系统自动修改密码(这个过程时间可能有点长耐心等待)完成后系统会自动重启新的密码生效了

实用指令

开机重启

1
2
3
4
5
6
7
8
9
10
sync                把内存的数据同步到磁盘
shutdown -h now 立该进行关机
shudown -h 1 一分钟后关机
shutdown -r now 现在重新启动计算机
halt 关机作用和上面一样
reboot 现在重新启动计算机

细节注意
1.不管是重启系统还是关闭系统首先要运行sync命令把内存中的数据写到磁盘中
2.目前的 shutdown/reboot/halt 等命令均已经在关机前进行了 sync

文件/目录

  • 显示当前目录的绝对路径
    1
    pwd
  • 查看当前目录的所有内容
    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
    tree [目录路径]      以树形结构展示目录

    注意如果提示没有tree可以使用 yum install tree 指令安装

    ls [选项] [目录路径] 以列表结构展示目录

    常用选项
    -a显示当前目录所有的文件和目录包括隐藏的
    -l以列表的方式显示信息
    -h文件大小展示处理
    -R递归查询目录下所有的文件

    ls -al

    使用 ll 指令显示的内容如下
    -rwxrw-r-- 1 kitty root 1213 Feb 2 09:39 abc

    前10位(-rwxrw-r--)代表不同的含义如下所示
    字符的含义
    (-) 代表的是普通文件 / 未分配权限
    (d) 代表的是目录相当于windows的文件夹
    (l) 代表的是链接相当于windows的快捷方式
    (c) 代表的是字符设备文件鼠标键盘
    (b) 代表的是块设备比如硬盘
    (r) 代表的是可读权限
    (w) 代表的是可写权限
    (x) 代表的是可执行权限
    位置代表的含义
    - 第0位 (-)确定文件类型-dlcb
    - 第1-3位(rwx)确定该文件 所有者 拥有该文件的可读可写可执行权限
    - 第4-6位(rw-)确定该文件 所在组 拥有该文件的可读可写权限未分配可执行权限
    - 第7-9位(r--)确定 其他用户 拥有该文件的可读权限未分配可写可执行权限
    - 其他说明
    - (1) 子文件/目录数量
    - (kitty) 所有者用户名
    - (root) 所在组的组名
    - (1213) 文件大小
    - (Feb 2 09:39) 最后修改日期
    - (abc) 文件名
  • 切换目录
    1
    2
    3
    cd ~        回到登录用户主目录
    cd .. 回到当前目录的上一级目录
    cd /home 切换到home目录
  • 创建目录
    1
    2
    3
    4
    5
    6
    mkdir [选项] 目录名

    常用选项
    -p创建多级目录

    mkdir -p /home/test
  • 删除目录
    1
    2
    3
    4
    5
    6
    7
    8
    9
    rm 目录名          只能删除空目录
    rm -rf 目录名 可以删除非空目录

    常用选项
    -r递归删除整个文件夹
    -f: 强制删除不提示

    rm /home/test
    rm -rf /home/test
  • 创建空文件
    1
    2
    3
    touch 文件名

    touch hello.txt
  • 拷贝
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    cp [选项] 目录或文件 拷贝到哪个目录


    1.拷贝hello.txt文件到/home/test目录下
    cp hello.txt /home/test
    2.拷贝home下的aaa目录到home的test目录下
    cp -r /home/aaa /home/test
    3.强制覆盖相同的文件不在进行提示
    \cp -r /home/aaa /home/test

  • 移动
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    mv 目录或文件 拷贝到哪个目录


    1.把当前目录下的文件移动到当前目录下可以实现重命名的操作
    mv hello.txt hello1.txt
    2.把hello.txt文件移动到home目录下
    mv hello.txt /home
    3.把hello.txt文件移动到home目录下并且重命名为hello1.txt
    mv hello.txt /home/hello1.txt
    4.把root下的test目录移动到home目录下
    mv /root/test /home
  • 文件内容处理
    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
    cat [选项] 要查看的文件

    常用选项
    -n显示行号

    cat -n hello.txt
    ----------------------------------------------------------------------
    less 要查看的文件

    less hello.txt

    键盘指令
    Space 向下翻一页
    pagedown 向下翻一页
    pageup 向上翻一页
    / 向下搜寻[字串]的功能n向下查找N向上查找
    ? 向上搜寻[字串]的功能n向上查找N向下查找
    q 退出
    ----------------------------------------------------------------------
    输入内容到控制台
    echo $path
    echo "hello world!"
    ----------------------------------------------------------------------
    用于显示文件的开头部分
    head 文件名 默认查看文件的前10行
    head -n 15 文件名 查看文件的前15行数据
    ----------------------------------------------------------------------
    用于显示文件的末尾部分
    tail 文件名 默认查看文件的后10行
    tail -n 15 文件名 查看文件的后15行数据
    tail -f 文件名 实时追踪文档的更新
    ----------------------------------------------------------------------
    输出重定向
    > 覆盖写
    >> 追加写


    1.把hello world!覆盖写入hello.txt
    echo "hello world!" > hello.txt
    2.把列表的内容追加写入hello.txt文件中
    ls -l >> hello.txt

    细节
    1.如果要写入的文件不存在则会自动创建
  • 快捷方式
    1
    2
    3
    4
    ln -s [原文件或目录] [软链接名]   给原文件创建一个软链接

    在home目录下创建一个名为myroot的快捷方式指向地址为/root
    ln -s /root /home/myroot
  • 修改文件/目录权限
    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
    可用字符u:所有者g:所有组o:其他人a:所有人
    ------------------------------------------------------------------------------------
    第一种修改方式+-= 变更权限
    chmod u=rwx,g=rx,o=x 文件/目录
    chmod o+w 文件/目录 给其他人添加文件/目录的可写权限
    chmod a-x 文件/目录 去除所有人对文件/目录的可执行权限


    1.给abc文件的所有者可读可写可执行的权限给所在组可读可执行权限给其它组可读可执行权限
    chmod u=rwx,g=rx,o=rx abc
    2.给abc文件的所有者除去可执行的权限给组添加可写的权限
    chmod u-x,g+w abc
    3.给abc文件的所有用户添加可读的权限
    chmod a+r abc
    ------------------------------------------------------------------------------------
    第二种修改方式通过数字变更权限
    4代表 r可读权限2代表 w可写权限1代表 x可执行权限
    rwx 权限可以用 7 表示因为4(r) + 2(w) + 1(x) = 7
    rw 权限可以用 6 表示因为4(r) + 2(w) = 6
    rx 权限可以用 5 表示因为4(r) + 1(x) = 5
    421 自由组合相加代表不同的权限

    chmod 751 文件/目录
    751第一位代表的是所有者第二位代表的是组第三位代表的是其他人
    这个指令的含义是给所有者 rwx 权限组 r-x 权限其他人 --x 权限

    将 /home/abc.txt 文件的权限修改成rwxr-xr-x
    chmod 755 /home.abc.txt
  • 修改文件/目录所在的组
    1
    2
    3
    4
    5
    6
    7
    8
    9
    chgrp [选项] 新的组 文件/目录

    常用选项-R如果修改的是目录则使目录下的所有子文件和目录都自动修改


    1.将 /home/abc.txt 文件所在的组修改成 kitty
    chgrp kitty /home/abc.txt
    2.将 /home/abc 目录下所有的文件和目录所在的组都修改成 tom
    chgrp -R tom /home/abc
  • 修改文件/目录的所有者
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    chown [选项] 新的所有者 文件/目录          修改文件/目录的所有者
    chown [选项] 新的所有者:新的组 文件/目录 修改文件/目录所有者和所在组

    常用选项-R如果修改的是目录则使目录下的所有子文件和目录都自动修改


    1.将 /home/abc.txt 文件的所有者修改成 tom
    chown tom /home/abc.txt
    2.将 /home/abc 目录下所有的文件和目录的所有者都修改成tom
    chown -R tom:tom /home/abc

时间日期

1
2
3
4
5
6
7
8
9
10
11
12
date                        显示当前时间
date "+%Y" 显示当前年份
date "+%m" 显示当前月份
date "+%d" 显示当前是哪一天
date "+%Y-%m-%d %H:%M:%S" 显示年月日时分秒

设置日期
date -s "2022-02-02 22:22:22"

查看日历
cal 显示当前月份日历信息
cal 2022 显示2020年日历信息

搜索查找

  • find 指令将从指定目录向下递归地遍历其各个子目录将满足条件的文件或者目录显示在终端
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    find [搜索哪个路径下的文件] [选项]

    选项
    -name <文件名称> 按照指定的文件名查询模式查找文件
    -user <用户名称> 查找属于指定用户名的所有文件
    -size <文件大小> 按照指定的文件大小查找文件 +size 大于-size 小于size 等于KMG可用标识


    find /home -name hello.txt 在home目录下搜索hello.txt文件
    find /home -user kitty 在home目录下搜索Kitty相关的文件
    find /home -size +200M 在home目录下搜索大于200M的文件
  • locate 指令
    • locate 指令第一次使用时必须使用 updatedb 指令创建locate数据库
    • locate 指令可以快速定位文件路径locate指令利用事先建立的系统中所有文件名称及路径的locate数据库实现快速定位搜索的文件
    • locate 指令无需遍历整个文件系统查询速度较快为了保证查询结果的准确度管理员必须定期更新locate时刻
      1
      2
      3
      locate 要搜索文件名称

      locate hello.txt
  • grep 指令过滤查找可以与 | 管道符号一起使用
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    grep [选项] 查找内容 源文件

    常用选项
    -n 显示匹配行及行号
    -i 忽略字母大小写
    -v 只选择不匹配查找内容的行

    查找hello.txt文件中包含你好的行两种写法
    grep -n "你好" /home/hello.txt
    cat /home/hello.txt | grep -n "你好"

压缩和解压

  • gzip / gunzip 指令gzip 用于压缩文件gunzip 用于解压缩文件
    1
    2
    3
    4
    5
    6
    gzip 文件名称
    gunzip 文件名称.gz


    gzip hello.txt
    gunzip hello.txt.gz
  • zip / unzip 指令zip 用于压缩文件unzip 用于解压缩文件
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    zip   [选项] 自定义压缩后的文件名.zip 将要压缩内容的路径
    unzip [选项] 自定义压缩后的文件名.zip

    常用选项
    -r 递归压缩压缩整个目录
    -d 目录 指定解压后文件存放的目录


    1.把test文件及其包含的文件和子文件都压缩压缩文件命名为mytest.zip
    zip -r mytest.zip test/
    2.把mytest.zip解压缩到root目录下
    unzip -d /root mytest.zip
  • tar 指令既可以用来压缩文件也可以用来解压缩文件
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    tar [选项] 自定义压缩后的文件名.tar.gz 将要压缩内容的路径

    常用选项
    -c 压缩文件
    -x 解压文件
    -v 显示详情信息
    -f 指定压缩后的文件名
    -z 打包同时压缩


    1.把 hello.txt 和 hello1.txt 文件打包压缩为 hello.tar.gz 文件
    tar -czvf hello.tar.gz /home/hello.txt /home/hello1.txt
    2.解压 hello.tar.gz 文件到root目录下
    tar -xzvf hello.tar.gz -C /root

定时任务

设置系统在某个时间执行的特定命令或程序

  • crontab 定时任务一直执行
    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
    crontab [选项]

    常用选项
    -e 设置登录用户的定时任务
    -l 查询登录用户的定时任务
    -r 删除登录用户的定时任务

    重启定时任务
    systemctl restart crond

    时间参数说明(* * * * *)
    第一位代表一小时中的第几分钟范围0-59
    第二位代表一天当中的第几小时范围0-23
    第三位代表一个月当中的第几天范围1-31
    第四位代表一年当中的第几个月范围1-12
    第五位代表一星期当中的星期几范围0-70和7都代表星期日

    特殊符号
    (*) 代表任何时间(* * * * *) 代表每分钟执行一次
    (,) 代表不连续的时间(0 8,12,16 * * *) 代表每天8点0分12点0分16点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号每周1的0点0分都会执行命令
    细节注意星期几和几号最好不要同时出现因为他们定义的都是天非常容易混乱

    每隔一分钟把 root 目录下的内容列表追加输入到 /home/log.txt 文件里
    crontab -e
    进入vim编辑器
    输入*/1 * * * * ls -l /root >> /home/log.txt
    :wq保存

    定时任务相关文件/etc/crontab
  • at 定时任务只执行一次
    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
    at [选项] [时间] 

    常用选项
    -m 当指定的任务被完成后将给用户发送邮件即使没有标准输出
    -I atq的别名查看任务
    -d atrm的别名删除任务
    -v 显示任务将被执行的时间
    -c 打印任务的内容到标准输出
    -V 显示版本信息
    -q 使用指定的队列
    -f 从指定文件读入任务而不是从标准输入读入
    -t 以时间参数的形式提交要运行的任务

    时间参数
    1.接受在当天的hh:mm(小时:分钟 )式的时间指定假如该时间已过去那么就放在第二天执行 例如04:00
    2.使用midnight (深夜)noon (中午)teatime(饮茶时间一般是下午4点)等比较模糊的词语来指定时间
    3.采用12小时计时制即在时间后面加上AM(上午)或PM(下午)来说明是上午还是下午例如12PM
    4.指定命令执行的具体日期指定格式为 month day (月 日) 或 mm/dd/yy (月/日/年) 或 dd.mm.yy (日.月.年)指定的日期必须跟在指定时间的后面 例如04:00 2021-03-01
    5.使用相对计时法指定格式为: now + count time-unitsnow就是当前时间time-units是时间单位这里能够是minutes(分钟)hours(小时)days(天)weeks( 星期)count是时间的数量几天几小时例如now + 5 minutes
    6.直接使用today(今天)tomorrow(明天)来指定完成命令的时间

    细节注意
    1.at命令是一次性定时计划任务at的守护进程atd会以后台模式运行检查作业队列来运行
    2.默认情况下atd守护进程每60秒检查作业队列有作业时会检查作业运行时间如果时间与当前时间匹配则运行此作业
    3.at命令是一次性定时计划任务执行完一个任务后不再执行此任务了
    4.在使用at命令的时候一定要保证atd进程的启动可以使用相关指令来查看
    5.定时任务执行完成后任务会自动删除


    1.2天后的下午五点执行指令/bin/ls /home
    at 5pm + 2 days 回车执行指令
    at> /bin/ls /home 然后输入定时任务要执行的指令再输入两次 Ctrl + D 保存指令
    2.明天17点钟输出时间到指定文件中 /home/date.log
    at 5pm tomorrow
    at> date >> /home/date.log
    3.两分钟后输出时间到指定文件中 /home/date.log
    at now + 2 minutes
    at> date >> /home/date.log

帮助指令

  • 获得帮助信息
    1
    2
    3
    man 命令或配置文件    

    man ls
  • 获取shell内置命令的帮助信息
    1
    2
    3
    help 命令

    help ls

其他指令

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
more         基于VI编辑器的文本过滤器
cat -n hello.txt | more 或 more hello.txt
Space 向下翻一页
Enter 向下翻一行
Ctrl+f 向下滚动一屏
Ctrl+b 返回上一屏
= 输出当前行的行号
:f 输出文件名和当前行的行号
q 退出
-------------------------------------------
查看执行过的命令
history 查看所有执行过的命令
history 10 查看最近执行的10条命令
!5 执行历史执行的第5条命令
-------------------------------------------
| 管道符号表示将管道符号前边命令的处理结果交给管道符号后边的命令处理
grep 过滤器支持正则表达式
wc 用于计算字数
xargs 传递参数的一个过滤器
less 文件内容查看
cat 查看文件的内容
awk 文本处理工具
sort 排序
unip 分组统计使用之前先排序sort不然统计会有问题
R 递归
id root 查询用户信息
who am i 第一次登录的用户是谁
clear 清屏
which 查看指令在哪个目录下
ps -ef 查看当前运行进程
ps -ef | grep 因为运行进程较多一般加上过滤器查询
kiss id 根据进程ID结束运行进程
lsblk 查看磁盘分区
source /etc/profile 刷新环境变量
chkrootkit/rootkit hunter 检测rootkit脚本

磁盘分区/挂载

硬盘说明

1.Linux硬盘分IDE硬盘和SCSI硬盘目前基本上是SCSI硬盘

2.对于IDE硬盘驱动器标识符为hdx~其中 hd 表明分区所在设备的类型这里是指IDE硬盘了x 为盘号(a为基本盘b为基本从属盘c为辅助主盘d为辅助从属盘~ 代表分区前四个分区用数字1到4表示它们是主分区或扩展分区从5开始就是逻辑分区hda3表示为第一个IDE硬盘上的第三个主分区或扩展分区hdb2表示为第二个IDE硬盘上的第二个主分区或扩展分区

3.对于SCSI硬盘则标识为 sdx~SCSI硬盘是用 sd 来表示分区所在设备的类型的其余则和IDE硬盘的表示方法一样

分区/挂载

1.Linux来说无论有几个分区分给哪一目录使用它归根结底就只有一个根目录一个独立且唯一的文件结构Linux中每个分区都是用来组成整个文件系统的一部分

2.Linux采用了一种叫载入的处理方法它的整个文件系统中包含了一整套的文件和目录且将一个分区和一个目录联系起来这时要载入的一个分区将使它的存储空间在一个目录下获得

3.分区跟文件目录是对应的硬盘分区挂载到目录下

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
fdisk /dev/sdb  输入指令开始进行分区

选项含义
m 显示命令列表
p 显示磁盘分区 同 fdisk -l
n 新增分区
d 删除分区
w 写入并退出
q 不保存退出

- 开始分区后输入 n 新增分区
- 然后输入 p 分区类型为主分区
- 两次回车默认剩余全部空间
- 最后输入 w 写入分区并退出若不保存退出则输入 q

lsblk -f 指令查看磁盘分区列表

细节注意分区后还需要格式化磁盘指定分区类型才可以使用
---------------------------------------------------------------
格式化磁盘
mkfs -t ext4 /dev/sdb1

细节注意
- ext4 指的是分区类型
- /dev/sdb1 指的是要格式化磁盘的目录磁盘的第一个分区
---------------------------------------------------------------
分区挂载
mount /dev/sdb1 /home/test

分区卸载
umount /dev/sdb1 指令 或者 umount /home/test 指令 都可以

细节注意
1.任意目录都可以挂载磁盘
2.使用命令行挂载分区重启服务器后会失效

永久挂载需要修改文件
- vim /etc/fstab
- 在文件中添加一行UUID=要挂载的分区ID可以通过lsblk -f 指令查看 /home/test
- :wq 保存并退出
- mount -a 即刻生效

磁盘查询

1
2
3
4
5
6
7
8
9
10
lsblk -f        查看磁盘分区列表
df -h 查看磁盘使用情况
df -h /目录 查看指定目录的磁盘使用情况

常用选项
-h 带有计量单位
-s 指定目录占用大小汇总
-a 包含文件
-c 列出明细的同时增加汇总值
--max-depeh=1 子目录查询深度

网络环境配置

查看网络配置

1
ifconfig

监控网络状态

1
2
3
4
5
6
7
8
9
10
11
netstat [选项]

常用选项
-an 按一定顺序排列输出
-p 显示哪个进程在调用


1.查看远程登录服务进程
netstat -anp | grep sshd
2.端口占用情况查询
netstat -tunlp

设置指定IP地址

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
需要修改配置文件
vim /etc/sysconfig/network-scripts/ifcfg-ens33

ifcfg-ens33 文件说明
DEVICE="eth0" 接口名(设备,网卡)
HWADDR="00:0C:2x:6x:0x:Xx" MAC地址
TYPE="Ethernet" 网络类型(通常是Ethemet)
UUID 随机id
ONBOOT="yes" 系统启动的时候网络接口是否有效(yes/no)
BOOTPROTO="dhcp" IP的配置方法
none 引导时不使用协议|BOOTP协议
static 静态分配IP
bootp BOOTP协议
dhcp DHCP协议
IPADDR=192.168.200.130 IP地址
GATEWAY=192.168.200.2 网关
DNS1=192.168.200.2 域名解析器

要修改的项/如果没有就添加一行
BOOTPROTO="static"
IPADDR=192.168.200.130地址可以改成自己需要的
GATEWAY=192.168.200.2地址可以改成自己需要的
DNS1=192.168.200.2地址可以改成自己需要的

修改添加完成后输入 :wq 保存修改
service network restart 重启网络服务 或者 reboot 重启服务器让设置生效

设置主机名

1
2
3
4
5
6
hostname    查看当前主机名

修改主机名
vim /etc/hostname
修改完成后输入 :wq 保存修改
reboot 指令重启服务器让设置生效

hosts映射

1
2
3
4
5
需要修改配置文件
vim /etc/hosts
添加一行目标主机地址 自定义名称
192.168.200.1 kitty
添加完成后输入 :wq 保存修改

主机名解析过程

hosts一个文本文件用来记录 IP 和 hostname(主机名) 的映射关系

DNSDomain Name System的缩写翻译过来就是域名系统是互联网上作为域名和IP地址相互映射的一个分布式数据库

解析过程在浏览器中输入地址www.baidu.com

  • 浏览器先检查浏览器缓存中有没有该域名解析IP地址有就先调用这个IP完成解析如果没有就检查DNS解析器缓存如果有直接返回IP完成解析 这两个缓存可以理解为 本地DNS解析器缓存一般来说当电脑第一次成功访问某一网站后在一定时间内浏览器或操作系统会缓存它的IP地址(DNS解析记录)
  • 如果 本地DNS解析器缓存 没有找到对应映射则检查系统hosts文件中有没有配置对应的域名IP映射如果有则完成解析并返回
  • 如果 本地DNS解析器缓存 和 hosts文件 中均没有找到对应的IP则到域名服务DNS进行解析域名

进程管理

在Linux中每个执行的程序都称为一个进程每一个进程都分配一个ID号(pid,进程号)

每个进程都可能以两种方式存在前台与后台前台进程就是用户目前屏幕上可以进行操作的后台进程则是实际在操作但由于屏幕上无法看到的进程通常使用后台方式执行

一般系统的服务都是以后台进程的方式存在而且都会常驻在系统中直到关机才会结束

查看进程

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
ps [选项]

常用选项
-a 显示当前终端的所有进程信息
-u 以用户的格式显示进程信息
-x 显示后台进程运行的参数
-e 显示所有进程
-f 全格式

列表参数的含义
USER 用户
PID 进程识别号
PPID 父进程识别号
CPU 占用CPU的百分比
MEM 占用物理内存的百分比
VSZ 占用虚拟内存大小
RSS 占用物理内存大小
TTY 终端信息
STAT 当前进程运行状态
S 睡眠
s 表示该进程是会话的先导进程
N 表示进程拥有比普通优先级更低的优先级
R 正在运行
D 短期等待
Z 僵死进程
T 被跟踪或者被停止
START 进程的启动时间
TIME 进程占用CPU的总时间
COMMAND 正在执行的命令或进程的名字
C CPU用于计算执行优先级的因子值越大优先级越低

ps -aux
ps -aux | grep 进程名字

查看进程树

1
2
3
4
5
pstree [选项]

常用选项
-p 显示进程的PID
-u 显示进程的所属用户

动态监控进程

top 与 ps 指令很相似它们都用来显示正在执行的进程Top 与 ps 最大的不同之处在于 top 在执行一段时间可以更新显示正在运行的的进程

1
2
3
4
5
6
7
8
9
10
11
12
13
14
top [选项]

常用选项
-d 3 每隔几秒更新一次默认3秒3是可变的单位为秒
-i 不显示闲置或者僵死的进程
-p 指定进程ID监控进程的状态

交互操作
P 以CPU使用率排序默认
M 以内存使用率排序
N 以PID排序
q 退出TOP
u 输入用户显示用户的进程
k 输入PID,输入9结束进程

终止进程

1
2
3
4
5
kill [选项] 进程识别号
killall 进程名称

常用选项
-9 强迫进程立即停止

服务管理

服务(service)本质就是进程但是服务是运行在后台的通常都会监听某个端口等待其它程序的请求比如mysgldsshd防火墙等因此我们又称为守护进程

开机的流程开机 > BIOS > /boot > systemd 进程 > 运行级别 > 运行级别对应的服务

开启/关闭服务

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
service 服务名 [start | stop | restart | reload | status]

细节注意
1.在Centos7.0 以后很多服务不再使用service而是使用 systemctl 指令
2.service 指令管理的服务可以在 /etc/init.d 中查看
3.使用 setup 指令可以查看所有的服务(*) 号标记的服务代表开机自启动

关闭/开启网络服务
service network stop
service network start

systemctl [start | stop | restart | status] 服务名

细节注意
1.systemctl 指令管理的服务可以在 /usr/lib/systemd/system 中查看

设置服务自启动

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
查看服务开机启动状态, grep 可以进行过滤
chkconfig --list [|grep 服务名]

给服务的各个运行级别设置自 启动/关闭
chkconfig --level [0 | 1 | 2 | 3 | 4 | 5 | 6] 服务名 on/off

细节注意
1.chkconfig 指令管理的服务可以在 /etc/init.d 中查看
2.服务设置好之后需要重启机器才可以生效

查看服务开机启动状态, grep 可以进行过滤
systemctl list-unit-files [|grep 服务名]
systemctl enable 服务名 设置服务开机启动
systemctl disable 服务名 关闭服务开机启动
systemctl is-enabled 服务名 查询某个服务是否是自启动的

防火墙

在真正的生产环境往往需要将防火墙打开如果我们把防火墙打开那么外部请求数据包就不能跟服务器监听端口通讯这时需要打开指定的端口比如802280803306等端口

1
2
3
4
5
6
7
8
9
10
11
firewall-cmd --permanent --add-port=端口号/协议      打开端口
firewall-cmd --permanent --remove-port=端口号/协议 关闭端口
firewall-cmd --query-port=端口号/协议 查看端口是否开放
firewall-cmd --reload 重启防火墙

细节注意
1.可以使用 netstat -anp 指令查看端口号/协议
2.设置完成后需要重启防火墙才可以生效

打开8080端口
firewall-cmd --permanent --add-port=8080/tcp

日志管理

CentoS6.x 日志服务是 syslogdCentOS7.6 日志服务是 rsyslogdrsyslogd 功能更强大 和 syslogd 服务兼容

配置文件

rsyslogd 日志服务是一个后台程序配置文件是 /etc/rsyslog.config

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
配置文件时的格式为'*' 存放日志文件
其中第一个 * 代表日志类型第二个 * 代表日志级别

日志类型分为
auth pam产生的日志
authpriv sshftp等登录信息的验证信息
corn 时间任务相关
kern 内核
lpr 打印
mail 邮件
mark(syslog)-rsyslog 服务内部的信息时间标识
news 新闻组
user 用户程序产生的相关信息
uucp nix to nuix copy主机之间相关的通信
local 1-7 自定义的日志设备

日志级别分为:
debug 有调试信息的日志通信最多
info 一般信息日志最常用
notice 最具有重要性的普通条件的信息
warning 警告级别
err 错误级别阻止某个功能或者模块不能正常工作的信息
crit 严重级别阻止整个系统或者整个软件不能正常工作的信息
alert 需要立刻修改的信息
emerg 内核崩溃等重要信息
none 什么都不记录

日志文件的格式
事件产生的时间 产生事件的服务器的主机名 产生事件的服务名或程序名 事件的具体信息

启动日志服务

1
2
3
4
5
6
7
ps aux | grep rsyslogd      查看日志服务是否运行

查看日志服务是否是开机自启动
systemctl list-unit-files | grep rsyslog

设置日志服务开机自启动
systemctl enable rsyslog.service

自定义日志

1
2
3
4
5
6
修改修改配置文件/etc/rsyslog.config

#增加自定义日志
#第一个 * 代表日志类型第二个 * 代表日志级别
#存放日志内容路径/var/log/zidingyi.log
*.* /var/log/zidingyi.log

日志轮替

日志轮替就是把旧的日志文件移动并改名同时建立新的空日志文件当旧日志文件超出保存的范围之后进行删除

centos7使用 logrotate 进行日志轮替管理要想改变日志轮替文件名字通过修改 /etc/logrotate.conf 配置文件中 dateext 参数

如果配置文件中有 dateext 参数那么日志会用日期来作为日志文件的后缀例如 secure-20201010这样日志文件名不会重叠吗也就不需要日志文件的改名只需要指定保存日志个数删除多余的日志文件即可

如果配置文件中没有 dateext 参数日志文件就需要进行改名当第一次进行日志轮替时当前的 secure 日志会自动改名为 secure.1当第二次进行日志轮替时 secure.1 日志会自动改名为ecure.2当前的 secure 日志会自动改名为 secure.1然后也会新建 secure 日志用来保存新的日志以此类推

日志轮替之所以可以在指定的时间备份日志是依赖系统定时任务在 /etc/cron.daily/ 目录就会发现这个目录中是有 logrotate 文件(可执行)logrotate 通过这个文件依赖定时任务执行的

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
logrotate 配置文件/etc/logrotate.conf 为 logrotate的全局配置文件

参数说明
daily 日志的轮替周期是每天
weekly 日志的轮替周期是每周
monthly 日志的轮替周期是每月
rotate num 保留的日志文件的个数0 指没有备份
compress 日志轮替时旧的日志进行压缩
create mode owner group 建立新日志同时指定新日志的权限与所有者和所属组
mail address 当日志轮替时输出内容通过邮件发送到指定的邮件地址
missingok 如果日志不存在则忽略该日志的警告信息
notifempty 如果日志为空文件则不进行日志轮替
minsize num[KB | MB] 日志轮替的最小值也就是日志一定要达到这个最小值才会轮替否则就算时间达到也不轮替
size num[KB | MB] 日志只有大于指定大小才进行日志轮替而不是按照时间轮替
dateext 使用日期作为日志轮替文件的后缀
sharedscripts 在此关键字之后的脚本只执行一次
prerotate/endscript 在日志轮替之前执行脚本命令
postrotate/endscriot 在日志轮替之后执行脚本命念


配置文件内容
# rotate log files weekly. 每周对日志文件进行一次轮替
weekly
# keep 4 weeks worth of backlogs. 共保存4份日志件当建立新的日志文件时旧的将会被删除
rotate 4
# create new (empty) log files after rotating old ones. 创建新的空的日志文件在日志轮警后
create
# use date as a suffix of the rotated file. 使用日期作为日志轮替文件的后缓
dateext
# uncomment this ifyou want your log files compressed. 日志文件是否压缩如果取消注释则日志会在转储的同时进行压缩
#compress
#RPM packages drop log rotation information into this directory

#包含 /etc/logrotate.d/ 目录中所有的子配置文件也就是说会把这个目录中所有子配置文件读取进来
#主要用于单独设置某一个服务的日志轮替
include /etc/logrotate.d

#下面是单独设置日志轮替优先级更高
# no packages own wtmp and btmp -- we'll rotate them here
var/log/wtmp {
monthly #每月对日志文件进行一次轮替
create 0664 root utmp #建立的新日志文件权限是 0664所有者是 root所属组是 utmp 组
minsize 1M #日志文件最小轮替大小是 1MB也就是日志一定要超过 1MB 才会轮替
rotate 1 #仅保留一个日志备份也就是只有 wtmp 和 wtmp.1 日志保留
}
var/log/btmp {
missingok #如果日志不存在则忽路该日志的警告信息
monthly
create 0600 root utmp
rotate 1
}

把自己的日志加入日志轮替有两种方法:
1. 直接在/etc/logrotate.conf 配置文件中写入该日志的轮替策略
2. 在 /etc/loqrotate.d/ 目录中新建一个该日志的轮替文件写入该日志的轮替策略因为该目录中的文件都会被 include 到主配置文件中所以也可以把日志加入轮替

查看内存日志

1
2
3
4
5
6
7
journalctl                                  查看全部
journalctl -n 3 查看最新3条
journalctl --since 19:00 --until 19:10:10 查看起始时间到结束时间的日志可加日期
journalctl -p err 查看报错日志
journalctl -o verbose 查看日志详细内容
journalctl_PID=1245 _COMM=sshd 查看包含这些参数的日志
或者journalctl | grep sshd

备份与恢复

Linux 的备份和恢复有两种方式

  1. 把需要的文件或者分区用 TAR 打包下次需要恢复的时候再解压开覆盖即可
  2. 使用 dump 和 restore 命令
    1
    2
    3
    4
    yum -y install dump
    yum -y install restore

    细节注意有可能安装 dump 备份指令时restore 恢复指令也一起安装了那就不需要再执行 yum -y install restore 安装了
  • dump 支持分卷和增量备份增量备份是指备份上次备份后修改/增加过的文件也称差异备份
    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
    语法说明
    dump [-cu] [-123456789] [-f <备份后文件名>] [-T <日期>] [目录或文件系统]
    dump -[w | W] 显示需要备份的文件及其最后一次备份的层级时间 日期
    cat /etc/dumpdates 可以查看备份的文件系统层级日期与时间等

    常用选项
    -c 创建新的归档文件并将由一个或多个文件参数所指定的内容写入归档文件的开头c 可以是[0|1|2|3|4|5|6|7|8|9]-1u
    -0123456789 备份的层级0为最完整备份会备份所有文件若指定0以上的层级则备份至上一次备份以来修改或新增的文件到9后再次轮替
    -f <备份后文件名> 指定备份后文件名
    -j 调用 bzlib 库压缩备份文件也就是将备份后的文件压缩成 bz2格式让文件更小
    -T <日期> 指定开始备份的时间与日期
    -u 备份完毕后在 /etc/dumpdares 中记录备份的文件系统层级日期与时间等
    -t 指定文件名若该文件已存在备份文件中则列出名称
    -W 显示需要备份的文件及其最后一次备份的层级时间日期
    -w 与 -W 类似但仅显示需要备份的文件

    将 /boot 分区所有内容备份到 /opt/boot.bak0.bz2 文件中备份层级为 0
    dump -0uj -f /opt/boot.bak0.bz2 /boot
    在之前备份 0 的前提下进行增量备份可以增量到 9 然后继续从 0 开始备份
    dump -1uj -f /opt/boot.bak1.bz2 /boot

    细节注意
    1.目录文件不支持增量备份只有分区才可以
    2.通过 dump 指令 和 crontab 指令搭配可以实现自动备份
    3.备份完成后最好把备份文件放到其他服务器或保存到硬盘
  • restore 用来恢复已备份的文件可以从 dump 指令生成的备份文件中恢复原文件
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    语法说明
    restore [模式选项] [选项]

    模式说明下面四个模式不能混用在一次命令中只能指定一种
    -C 使用对比模式将份的文件与已存在的文件相互对比
    -i 使用交互模式在进行还原操作时restors指令将依序询间用户
    -r 进行还原模式
    -t 查看模式看备份文件有哪些文件

    常用选项
    -f 备份文件 从指定的文件中读取备份数据进行还原操作


    restore -r -f /opt/boot.bak0.bz2 //恢复到第1次完全备份状态
    restore -r -f /opt/boot.bak1.bz2 //恢复到第2次增量备份状态

    细节注意如果有增量备份需要把增量备份文件也进行恢复 按增量顺序来恢复即可

rpm/yum

RPM 是RedHat Package ManagerRedHat软件包管理工具的缩写RPM 用于互联网下载包的打包及安装工具

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
软件包名firefox-60.2.2-1.el7.centos.x86_64
firefox 软件名称
60.2.2-1 软件版本号
el7.centos 操作系统
x86_64 64位i686/i38632位noarch通用

rpm -q 软件包名 查询软件包是否安装
rpm -qa | grep 过滤 查询所安装的 RPM 安装包
rpm -qi 软件包名 查询软件包信息
rpm -ql 软件包名 查询软件包中的文件
rpm -qf 文件全路径 查询文件所属的软件包

rpm -e 软件包名 删除软件包
rpm -e --nodeps 软件包名 强制卸载

rpm -ivh 软件包路径 安装RPM包
参数说明(i)install 安装(v)verbose 提示(h)hash 进度条

YUM 是一个Shell前端软件包管理器基于 RPM 包管理能够从指定的服务器自动下载 RPM 包并且安装可以自动处理依赖性关系并且一次安装所有依赖的软件包

1
2
3
yum list | grep 过滤      查询YUM服务器类似于应用商店有哪些可以安装的软件包

yum install 软件包 下载安装

Linux内核升级

1
2
3
4
5
6
uname -a                查看当前的内核版本
yum info kernel -q 检测内核版本显示可以升级的内核
yum update kernel 升级内核
yum list kernel -q 查看已经安装的内核

细节注意安装好以后需要重启然后选择新的内核才能生效不然用的还是旧的内核

安装JDK

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
mkdir /opt/jdk                              创建存放JDK安装包的目录

下载JDK安装包百度网盘有通过xftp 上传到 /opt/jdk 目录下

cd /opt/jdk 进入存放JDK安装包的目录

tar -zxvf jdk-8u261-linux-x64.tar.gz 解压安装包

mkdir /usr/local/java 创建java目录

mv /opt/jdk/jdk1.8.0_261 /usr/local/java 把解压后的安装包移动到java创建的java目录下

配置 jdk 环境变量
vim /ete/profile
export JAVA_HOME=/usr/local/java/jdk1.8.0_261
export PATH=$JAVA_HOME/bin:$PATH

让配置文件生效
source /etc/profile

验证
java -version

安装MAVEN

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
mkdir /opt/maven                                     创建存放MAVEN安装包的目录

下载MAVEN安装包百度网盘有通过xftp 上传到 /opt/maven 目录下

cd /opt/maven 进入存放MAVEN安装包的目录

tar -zxvf apache-maven-3.9.6-bin.tar.gz 解压安装包

mkdir /usr/local/maven 创建maven目录

mv /opt/maven/apache-maven-3.9.6 /usr/local/maven 把解压后的安装包移动到maven创建的maven目录下

配置 maven 环境变量
vi /ete/profile
export M2_HOME=/usr/local/maven/apache-maven-3.9.6
export PATH=$PATH:$JAVA_HOME/bin:$M2_HOME/bin

让配置文件生效
source /etc/profile

验证
mvn -v

安装Tomcat

1
2
3
4
5
6
7
8
9
10
11
12
13
mkdir /opt/tomcat                           创建存放Tomcat安装包的目录

下载Tomcat安装包通过xftp6 上传到 /opt/tomcat 目录下

cd /opt/tomcat 进入存放tomcat安装包的目录

tar -zxvf tomcat-linux-x64.targz 解压安装包

./start.sh 进入 tomcat/bin 目录启动Tomcat

防火墙开放8080端口
firewall-cmd --permanent --add-port=8080/tcp
firewall-cmd --reload

Shell编程

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

脚本运行

Shell 脚本后缀一般为 .sh

脚本常用的执行方式:

方式1(输入脚本的绝对路径或相对路径)首先要赋予脚本 x 权限再执行脚本

方式2(sh+脚本)不用赋予脚本 x 权限直接执行即可

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
vim hello.sh                创建脚本文件

#!/bin/bash 编写脚本程序
each "hello world!"

:wq 保存脚本文件

sh hello.sh 执行脚本文件不需要文件执行权限

chmod u+x hello.sh 赋予脚本文件执行权限
./hello.sh 执行脚本文件需要文件执行权限

单行注释
#注释内容

多行注释
:<<!
需要另起一行注释内容
!

变量

全局变量系统环境变量可以在环境变量中添加修改

系统变量$HOME$PWD$SHELL$USER等等可以使用 set 指令查看

自定义变量变量名=值

撤销自定义变量unset 变量名

静态变量readonly 变量名=值不能使用 unset 撤销不然会报错

位置参数变量执行脚本时可以加上参数sh hello.sh 100 200脚本使用 $1 获取 100$2 获取200以此类推超过10个参数需要用大括号包裹如 ${10}

预定义变量shell 设计者已经定义好的变量可以在 shell 脚本中直接使用

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
#!/bin/bash
#案例1定义变量A
A=100

#输出变量需要加上$
echo A=$A
echo "A=$A"

#案例2撤销变量A
unset A
echo "A=$A"

#案例3声明静态的变量B=2静态变量不能撤销会报错
readonly B=2
echo "B=$B"

#案例4将Linux指令的返回值赋值给变量
#反引号
C=`date`
#$() 跟反引号的作用一样
D=$(date)

#案例5把系统变量赋值自定义变量
E=$HOME

#案例6获取全局变量
F=$JAVA_HOME

#案例7获取位置参数
G=$1
H=${11}

细节注意
1.变量名称可以由字母数字和下划线组成但是不能以数字开头
2.等号两侧不能有空格
3.变量名称一般习惯为大写
4.$0 代表命令本身
5.$1-$9 代表第一到第九个参数十个以上的参数需要用大括号包含${10}
6.$* 这个变量代表把命令行中所有的参数看成一个整体
7.$@ 这个变量代表把命令行中所有的参数看成一个整体但每个参数区分对待
8.$# 这个变量代表命令行中所有参数的个数
9.$$ 获取当前进程的进程号(PID)
10.$! 后台运行的最后一个进程的进程号(PID)
11.$? 最后一次执行的命令的返回状态
- 如果这个变量的值为0证明上一个命令正确执行
- 如果变量的值为非0(具体是哪个数由命令自己来决定)则证明上一个命令执行不正确

运算符

加( + )减( - )乘( * )除( / )取余( % )

第一种写法$((运算式))

第二种写法$[运算式]

第三种写法expr m + n注意运算符之间要有空格乘的运算符为( \* )

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#!/bin/bash
#第一种写法$((运算式))
NUM1=$(((2+3)*4))

#第二种写法$[运算式]
NUM2=$[(2+3)*4]

#第三种写法expr m + n
TEMP= `expr 2 + 3`
NUM4= `expr $TEMP \* 4`

细节注意
1.第三种写法运算符之间要有空格
2.第三种写法乘的运算符( \* )乘需要加一个( \ )
3.第三种写法多项计算需要分步计算
4.第三种写法要是想把结果赋值给变量需要加双引号
5.综上所述第三种写法太麻烦直接放弃推荐第二种写法$[运算式]

条件判断

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
单分支
if [ 条件判断式 ]
then
代码
fi

多分支
基本语法一
if [ 条件判断式 ]
then
代码
elif [ 条件判断式 ]
then
代码
fi

基本语法二
case $变量名 in
"值1")
代码
;;
"值2")
代码
;;
"*")
*号代表其他情况
;;
esac

常用判断
= 字符串比较
-lt 小于
-le 小于等于
-eq 等于
-gt 大于
-ge 大于等于
-ne 不等于

文件权限判断
-r 是否有读的权限
-w 是否有写的权限
-x 是否有执行的权限

按照文件类型进行判断
-e 文件是否存在
-d 文件是否存在并且是一个目录
-f 文件是否存在并且是一个常规的文件

#!/bin/bash
#案例1: ok 是否等于 ok
if [ "ok"="ok" ]
then
echo "equal"
fi

#案例2: 23是否大于等于22
if [ 23 -ge 22 ]
then
echo "大于"
fi

#案例3: /home/aaa.txt 目录中的文件是否存在
if [ -f /home/aaa.txt ]
then
echo "存在"
fi

#案例4: 输入一个参数大于等于60则输出"及格"如果小于60则输出 "不及格"
if [ $1 -ge 60 ]
then
echo "及格"
elif [$1 -lt 60 ]
then
echo "不及格"
fi

#案例5输入一个参数当参数是 1 时输出"周一"是 2 时就输出"周二"其它情况输出"other"
case $1 in
"1")
echo "周一"
;;
"2")
echo"周二"
;;
*)
echo "other"
;;
esac

细节注意
1.[ 条件判断式 ]条件判断式两边要有空格
2.[ ok ] 括号中非空返回 true[ ] 空值返回false注意空值的话括号中间也要加空格

循环

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
基本语法一
for 变量 in 值1 值2 值3...
do
代码
done

基本语法二
for(( 初始值;循环控制条件;变量变化 ))
do
代码
done

基本语法三
while [ 条件判断式 ]
do
代码
done

#!/bin/bash
#案例1打印命令行输入的参数 [这里可以看出 $* 和 $@ 的区别]
for i in "$*"
do
echo "num is $i"
done
echo "==========分割线============"
for n in "$@"
do
echo "num is $n"
done

#案例2计算1到100的和并输出
SUM=0
for(( i=1;i<=100;i++ ))
do
SUM=$[$SUM+$i]
done
echo "1到100的和=$SUM"

#案例3从命令行输入一个数n统计从 1+..+ n 的值是多少?
SUM=0
i=1
while [ $i -le $1 ]
do
SUM=$[$SUM+$i]
i=$[$i+1]
done
echo "1到$1的和=$SUM"

细节注意
1.while后有一个空格[ 条件判断式 ]条件判断式前后也要有空格

控制台输入

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
基本语法
read [选项] 接收值的变量名

基本选项
-p 指定读取值时的提示信息
-t 指定读取值时等待的时间(秒)


#!/bin/bash
#案例1:读取控制台输入一个NUM1值
read -p "请输入一个数NUM1=" NUM1
echo"你输入的NUM1=$NUM1"

#案例2: 读取控制台输入一个NUM2值在10秒内输入
read -t 10 -p "请输入一个数NUM2=" NUM2
echo"你输入的NUM2=$NUM2

细节注意
1.如果加上时间参数超时未输入会继续往下执行不会阻塞

函数

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
系统函数有很多这里只列举几种

dirname返回完整路径最后 / 的前边部分常用于获取路径
基本语法
dirname [pathname]
案例获取 /home/aaa/test.txt 的文件路径
dirname /home/aaa/test.txt

basename返回完整路径最后 / 的后边部分常用于获取文件名
基本语法
basename [pathname] [suffix]
常用选项
suffix 指定后会去除文件的后缀
案例获取 /home/aaa/test.txt 的文件名称
basename /home/aaa/test.txt .txt

自定义函数基本语法
function funname() {
代码
}

#!/bin/bash
#案例1: 计算输入两个参数的和(动态的获取)
#定义函数
function getSum() {
SUM=$[$n1+$n2]
echo "和是=$SUM"
}
#输入两个值read
read -p "请输入一个数n1=" n1
read -p "请输入一个数n2=" n2
#调用自定义函数
getSum $n1 $n2

学习资源