首页 Linux命令行和shell脚本学习
文章
取消

Linux命令行和shell脚本学习

第1章 初识Linux Shell

1.1 什么是Linux

Linux主要可以划分为4部分:

  • 内核
  • GNU工具
  • 图形化桌面环境
  • 应用软件

image-20211025220710887

1.1.1 内核

内核功能:

  • 系统内存管理

    包括物理内存和虚拟内存(虚拟内存是计算机系统内存管理的一种技术。它使得应用程序认为它拥有连续的可用的内存(一个连续完整的地址空间),而实际上,它通常是被分隔成多个物理内存碎片,还有部分暂时存储在外部磁盘存储器上,在需要时进行数据交换。)

  • 软件程序管理

    内核创建第一个进程(init进程),由该进程来启动系统上的其他进程,内核启动时,会将该进程加载到虚拟内存中。

    Linux操作系统运行级别从1到5:

    • 1:单用户模式,通常用来紧急的文件系统维护
    • 3:标准的启动运行级,支持大多数软件、网络支持程序等
    • 5:会启动图形化的X Windows系统,运行用户使用图形化窗口登录系统
  • 硬件设备管理

    Linux系统将硬件设备当成特殊的文件,称为设备文件

    • 字符型设备文件:每次只能处理一个字符的设备,如调制解调器和终端
    • 块设备文件:如硬盘
    • 网络设备文件:采用数据包发送和接受数据的设备,如各种网卡和回环设备。
  • 文件系统管理:支持用不同类型的文件系统来进行硬盘数据读写。

    image-20211025230040799

1.1.2 GNU工具

一套完整的UNIX工具

  1. 核心工具软件包 coreutils:

    • 处理文件
    • 操作文本
    • 管理进程
  2. shell

    GNU/Linux shell是一种特殊的交互式工具

    • 启动程序
    • 管理文件
    • 管理进程

    多个shell命令写入文件,称作shell脚本

    所有linux发行版默认是bash shell

    其他版本 略

1.1.3 Linux桌面环境

简单了解即可

  1. X Windows 直接和PC上的显卡及显示器打交道的底层程序。(其核心 仅仅是可以产生图形化显示环境)
  2. 主流桌面环境:
    • KDE桌面:类似windows的
    • GNOME:如centos
    • Unity:如Ubuntu
  3. 其他略

1.2 Linux发行版

没啥重点,简单浏览了一遍 不多废话。

第2章 走进shell

2.1 进入命令行

哑终端:显示器和键盘通过串行电缆连接到Unix系统

如今:虚拟控制台

CLI:command line interface

2.1.1 控制台终端

退出图形化界面进入文本模式,称作 Linux控制台(仿真了早期的硬接线控制台终端)

可创建多个虚拟控制台

2.1.2 图形化终端

图形化界面中的是 终端仿真器

图形界面的组成如图:

image-20211026153709362

2.2 通过Linux控制台终端访问CLI

ctrl+ALT+F1~F7 进入要使用的虚拟控制台

image-20211026154649875

这里直接按F1和F2会到图形化界面去 不知道为啥 不过F3后面都行

tty : teletypewriter 电传打字机

这里各个状态都会保存 如可以起到tty4 再切回已经登陆的tty3

调颜色 略

2.3 通过图形化终端仿真访问CLI

相关软件包较多,具体略

主要关注大部分Linux发行版都有的 GNOME Terminal、Konsole Terminal和xterm

2.4 访问GNOME Terminal

ubuntu unity 用的是该软件包

可以用CTRL+ALT+T 来快速呼出

其他几个 略

相关功能介绍略 简单浏览即可

2.5 访问Konsole Terminal

用到再看

2.6 访问xterm

用到再看

第3章 基本的bash shell命令

3.1 启动shell

3.2 shell 提示符

默认 $ 可修改

3.3 bash手册

man命令

用来访问存储在系统上的手册页面

比如 man gnome terminal

image-20211027141546089

可以使用 -k 关键字来模糊查找

image-20211027141713293

man 区域号 命令

来读不同的内容区域 比如上图的(1)就是表示内容区域1

image-20211027142408007

image-20211027142428573

除了man,还可以使用 info命令以及大部分命令支持 -help –help

3.4 浏览文件系统

3.4.1 Linux文件系统

linux在路径名中不使用驱动器盘符

文件存储在单个目录结构中,称之为虚拟目录,只包含一个称为root根/的基础目录,根驱动器上会创建 挂载点的特殊目录,用于存储额外设备的目录,比如:

image-20211027143635165

常见的linux目录名称如下,可以记一下 etc mnt sbin srv usr var

image-20211027143740116

3.4.2 遍历目录

cd destination

表示方法:

  • 绝对:/开始

    pwd命令可以显示当前的工作目录

    image-20211027145000516

    ~表示的是主目录(系统分配给用户的)

    cd会直接跳回主目录

    image-20211027145156887

  • 相对

    特殊的 用...

    不用/开头

3.5 文件和目录列表

列表命令 ls

3.5.1 基本列表功能

image-20211027150010380

-F 会在目录文件后面加 /以示区分

-R 会递归输出目录下子目录中的文件

-a 会显示隐藏文件 通常是用来保存配置信息

-d 显示目录的信息,但不列出目录的内容

image-20211027150343366

3.5.2 显示长列表

使用参数 -l

image-20211027150451151

文件信息:

  • 文件类型: d 目录 - 文件 c 字符型设备 b 块设备
  • 文件权限
  • 文件的硬链接总数
  • 文件属主的用户名
  • 文件属组的组名
  • 文件大小 字节为单位
  • 文件的上次修改时间
  • 文件名或目录名

3.5.3 过滤输出列表

ls 支持命令行中添加过滤器 即一个简单的文本匹配的字符串 如:

image-20211027151021323

?匹配一个任意字符 *匹配0个或者多个字符

用这些符号的匹配称为文件扩展匹配,(貌似语法和正则表达式一样的,不多写了)

3.6 处理文件

3.6.1 创建文件

touch 命令可以创建空文件

比如 touch touch_test

touch一个存在的文件 会改变上一次修改时间,如果只改 上一次访问时间 加参数-a ls -l --time=atime 可看到文件的上一次访问时间

3.6.2复制文件

cp 命令 应该是copy的缩写

最基本语法 cp source destination

-i 参数可以提示 是否覆盖已存在的同名文件

如果要复制到目录 应该记得加上 / 来表示是目录

cp 命令 如果要复制到当前目录 可以使用 . 单点符表示当前目录

3.6.3 制表键自动补全

TAB 可以自动不全文件名或目录名

3.6.4 链接文件

包括符号链接和硬链接

命令 ln 因该是link的缩写

  • 符号链接:一个文件指向另一个文件,两个文件不同

    ln -s 目标 源 目标和源都是存在的

  • 硬链接:虚拟的,文件相同,ls -i 参数可以看到文件的 inode编号,两者一样

    ln 目标 源 源不存在

3.6.5 重命名文件

使用命令 mv (moving移动) 改文件名或者目录名

移动到其他位置(目录)或者改名(inode和时间戳不变)

3.6.6 删除文件

rm (removing)

bash shell 无回收站 rm -i 提示自己是否删除

3.7 处理目录

3.7.1 创建目录

mkdir 命令

-p 参数创建多个目录及其子目录

mkdir -p new_dir/sub_dir/under_dir

3.7.2 删除目录

rmdir

默认只删除 空目录

如果要删除带有文件的目录 可以使用 rm -r dir递归删除

每个文件都会询问 可以使用 -f 参数来取消提示

rm -rf dir 很危险 一定要检查清楚

3.8 查看文件内容

3.8.1 查看文件类型

在显示文件内容之前,应先查看一下文件类型,如果是bin文件,可能满屏乱码

file 命令

file filename

image-20211027160143939

3.8.2 查看整个文件

  1. cat 命令

    -n 加上行号

    无法控制 大文件会一闪而过

  2. more 命令 空格继续一页 回车逐行显示

  3. less 命令 (less is more)

    more的升级版 可以前后翻动

3.8.3 查看部分文件

  1. tail 命令 显示文件末尾内容 -n控制显示行数

    image-20211027161554656

  2. head 命令 类似

第4章 更多的bash shell 命令

主要介绍系统管理命令

4.1 检测程序

4.1.1 探查进程

ps命令

image-20211028194126527

默认显示运行在当前用户下的进程

三种风格的命令行参数

  1. Unix - 主要记住 -ef-l

    通常 ps -ef -e 显示所有运行在系统上的进程,-f 扩展输出

    image-20211028194815494

    说明:

    • PPID 父进程ID
    • C: cpu 利用率
    • sttime: 进程启动时的系统时间
    • TIME:运行进程需要的累计CPU时间
    • CMD:启动进程的程序名称

    -l 更加详细:

    image-20211028195046388

    • F:内核分配给进程的系统标记
    • S: 进程状态 O 运行 S 休眠 R 可运行待运行 Z僵化(父进程不存在) T 停止
    • PRI 进程优先级 (数字越小 优先级越高)
    • NI 谦让度值 用来参与决定优先级
    • ADDR 进程的内存地址
    • SZ 如果进程被换出 所需的内存空间
    • WCHAN 进程休眠的内核函数的地址
  2. BSD 风格 无破折线

    比如 ps l 比起 -l l貌似更好

    image-20211028195607534

    说明:

    • VSZ 进程在内存中的大小
    • RSS 进程在未换出时占用的物理内存
    • STAT 双字符状态码 第一列和Unix风格的含义一一致,第二个参数:
      • < 高优先级
      • N 低优先级
      • L 所有页面锁定在内存中
      • s 控制进程
      • l 多线程
      • +运行在前台的
  3. GNU风格 双破折线

    具体的懒得写了 –forest 比较有意思 会显示进程的层级信息

    比如 写 ps -ef –forest:

    image-20211028200321216

4.1.2 实时监测进程

实时显示进程信息 top 命令

image-20211028200546326

第一行:系统当前时间 运行时间 用户数 系统的平均负载(最近1分钟、5分钟和15分钟,超过2比较高)

4.1.3 结束进程

进程之间通过 信号 来进行通信。

看看即可:

image-20211028201051673

  1. kill 命令

    kill 进程号 向指定PID 发送 TERM 信号

    前提是进程的属主或root用户

    部分进程不会停止 用 -s参数强制终止 也支持指定其他信号

    如: kill -s HUP 1234

  2. killall 命令

    通过进程名(支持通配符)来终止进程‘

4.2 监测磁盘空间

在使用新的存储媒体之前,需要将其放到虚拟目录下,称之为 挂载 mounting

  1. 挂载命令 mount

  2. 移除挂载 umount

  3. df命令查看设备的磁盘空间使用情况

  4. du 查看目录下文件的大小

4.3 处理数据文件

  1. 排序数据 sort

    • *默认将数字当作字符排序 -n 会当作数字排序

    • -M 可以按3字符的月份排序

    • 还有常用的 -k -t -t表示分隔符 -k表示按第几个位置排序

      image-20211028202948670

  2. 搜索数据:grep 命令

    grep [options] pattern [file]

    主要记一下:

    • -v 反向(输出不匹配的行)
    • -n 输出行号
    • -c 输出匹配的行数
    • -e 指定多个匹配模式 如 grep -e t -e f filename
    • 可以用正则 如 grep [tf] filename
  3. 文件压缩工具

    image-20211028203608883

    最主要的时gzip 其次是 bzip2

    对于 gzip

    • gzcat 查看压缩过的文件内容
    • gunzip 解压
  4. 归档数据

    tar function [options] object1 object2

    image-20211028203905589

    image-20211028204418276

    常见的 tgz 后缀结尾 是 gzip压缩过的 tar文件

    第5章 理解shell

shell 是一个时刻都在运行的复杂交互式程序

5.1 shell的类型

一般在 /etc/passwd文件中记载用户的默认shell

5.2 shell的父子关系

image-20211031195514389

子shell 也称 subshell

ps -f 可以查看PPID 父进程id

用exit退出子shell,也可以退出当前的虚拟控制台或终端仿真软件

5.2.1 进程列表

;命令之间,即命令列表

进程列表 将这些 用括号 括起来 (command1;command2...),会生成一个子shell;可以嵌套括号,用 echo $BASH_SUBSHELL 来输出子shell数量

5.2.2 别出心裁的子shell用法

  1. 探索后台模式:

    & 后台作业 会显示 后台作业号 【1】

    image-20211031205845754

    jobs 命令 可以看到后台作业执行情况

  2. 将进程列表置入后台

  3. 协程

    示例: coproc my_job { sleep 2; sleep 3; }

子shell的成本不低

5.3 理解shell的内建命令

5.3.1 外部命令

也称文件系统命令 ps就是一个外部命令,可以用 which 或者tye 被执行时,会创建出一个子进程,被称之为衍生(forking)

5.3.2 内建命令

type命令可以判断是否时内建

部分文件可能有两个版本 默认内建 如果要使用外部 指定文件地址即可

image-20211031213515866

常用命令:

  1. history

    history -a 强制写入

    !n n指的是history中的命令编号

    image-20211031214816964

  2. alias 创建命令别名,比如:

    alias li='ls -li'

第6章 *使用linux环境变量

6.1 什么是环境变量

在内存中存储数据,以便程序或者shell在运行的脚本中轻松访。

环境变量分为全局和局部变量两种。

6.1.1 全局环境变量

系统环境变量一般是全大写字母

printenv 或者 env可以查看环境变量

一些示例:printenv HOME echo %HOME

6.1.2 局部环境变量

只能在定义它们的进程中可见

set会显示所有环境变量(全局、局部、用户定义)

6.2 设置用户定义变量

6.2.1 设置局部用户定义变量

image-20211101131251641

  1. 用户自定义 应全小写
  2. 变量名、等号和值之间不应该有空格,否则会把值当成单独的命令
  3. 子shell中不可用

6.2.2 设置全局

使用 export命令将定义的变量导出 (bash会生成一个子shell)

子shell中改变全局不会影响到父shell

6.3 删除环境变量

unset命令

操作变量 不加 $ 使用变量 加 $

6.4 默认的shell环境变量

6.5 设置PATH 环境变量

PATH=$PATH:/home/zs/myscript

path中各个目录是用:分割的

6.6 定位系统环境变量

启动bash shell时,默认情况下bash会在几个文件中查找命令(这些文件称之为启动文件或环境文件

启动bash shell的三种方式:

6.6.1 登录shell

登录时作为默认登录shell,登录shell会从5个文件中读取命令:

1
2
3
4
5
/etc/profile
$HOME/.bash_profile
$HOME/.bashrc
$HOME/.bash_login
$HOME/.profile

/etc/profile:默认的主启动文件

第7章 理解linux文件权限

7.1 linux的安全性

用户权限是通过创建用户时分配的用户ID来跟踪的

7.1.1 /etc/passwd

系统账户:Linux为各种服务创建的账户,是各种服务进程访问资源用的特殊账户

image-20211102124345169

字段信息:

  1. 用户名
  2. 密码 (保存在/etc/shadow)
  3. 用户ID(一般用户UID在500之后)
  4. 组ID
  5. home目录
  6. 默认shell

7.1.2 /etc/shadow

image-20211102124633647

第二个字段为加密后的字段

该文件只能root权限才能访问

7.1.3 添加新用户

useradd 命令

image-20211102125010877

image-20211102125022116

7.1.4 删除用户

/usr/bin/userdel -r test -r 删除该用户的home目录以及邮件目录 否则只删除 passwd中的用户信息

7.1.5 修改用户

image-20211102125308611

7.2 使用Linux组

组 group

允许多个用户对系统中的对象共享一组共用的权限

/etc/group 文件

image-20211102130259577

  • 组名
  • 组密码
  • GID
  • 属于该组的用户列表

添加组

/usr/sbin/groupadd shared

/usr/sbin/usermod -G shared testuser

7.3 理解文件权限

image-20211102130821758

touch 默认分配权限 umask修改(掩码) 具体略

7.4 改变安全性设置

7.4.1 改变权限

两种:

  • chmod 760 newfile

  • chmod [ugoa] [+-=][rwxXstugo]

    后面几个不常见 懒得写了 例子 chmod u+w file

7.4.2 改变所属关系

chown改变文件的属主

chgrp改变文件的默认属组

7.5 共享文件

SGID会强制某个目录下创建的新文件或目录都沿用该父目录的属组

第8章 管理文件系统

8.1 探索LINUX文件系统

8.1.1 基本的linux文件系统

  1. ext系统 (扩展文件系统 extended filesystem)

    使用虚拟目录来操作硬件设备,在物理设备上按定长的块来存储数据

    文件系统通过索引节点号而不是文件全名及路径来标识文件

  2. ext2系统

    通过将数据块分组解决了ext的碎片化 fragmentation的问题

    容易停电或系统崩溃时损坏

8.1.2 日志文件系统

本文由作者按照 CC BY 4.0 进行授权

Java 后端同前端交互

Python 学习笔记