【2018深信服 醒狮计划】《Linux命令行与Shell脚本编程大全》学习笔记

2018深信服“醒狮计划”笔记

第3周(5.02-5.13)

课程 必修 选修 基本要求
Shell编程 《Linux命令行与Shell脚本编程大全》 《Perl编程24学时教程》 熟练掌握Linux基本命令和使用,掌握grep、awk、sed、正则表达式等Shell编程

《Linux命令行与Shell脚本编程大全》(605页)

哈哈,时间提前,内容很多,26章,每天得完成4章才行,提前开始狂啃

day1


第一部分 Linux 命令行

第1章 初识Linux shell

1. Linux系统

将硬件设备当成特殊的文件,称为设备文件。设备文件有3种分类:
+ 字符型设备文件
+ 块设备文件
+ 网络设备文件

2. 文件系统管理

不同于其他一些操作系统,Linux内核支持通过不同类型的文件系统从硬盘中读写数据。除
了自有的诸多文件系统外,Linux还支持从其他操作系统(比如Microsoft Windows)采用的文件
系统中读写数据。内核必须在编译时就加入对所有可能用到的文件系统的支持。表1-1列出了
Linux系统用来读写数据的标准文件系统。

【2018深信服 醒狮计划】《Linux命令行与Shell脚本编程大全》学习笔记_第1张图片

3. 核心GNU工具

GNU项目的主旨在于为Unix系统管理员设计出一套类似于Unix的环境。这个目标促使该项目
移植了很多常见的Unix系统命令行工具。供Linux系统使用的这组核心工具被称为coreutils(core
utilities)软件包。

GNU coreutils软件包由三部分构成:

  • 用以处理文件的工具
  • 用以操作文本的工具
  • 用以管理进程的工具

4. shell

NU/Linux shell是一种特殊的交互式工具。它为用户提供了启动程序、管理文件系统中的文件以及运行在Linux系统上的进程的途径。 shell的核心是命令行提示符。

【2018深信服 醒狮计划】《Linux命令行与Shell脚本编程大全》学习笔记_第2张图片

5. linux 发行版

【2018深信服 醒狮计划】《Linux命令行与Shell脚本编程大全》学习笔记_第3张图片

第2章 走进shell

1. 控制台终端

Linux系统启动后,它会自动创建出一些虚拟控制台。虚拟控制台是运行在Linux系统内存中
的终端会话。无需在计算机上连接多个哑终端,大多数Linux发行版会启动5~6个(有时会更多)
虚拟控制台,你在一台计算机的显示器和键盘上就可以访问它们。

2. 通过 Linux 控制台终端访问 CLI

inux发行版通常使用Ctrl+Alt组合键配合F1或F7来进入图形界面。Ubuntu使用F7,而RHEL则使用F1。

3. 控制台背景颜色

8种颜色可选

setterm –background white

black 、 red 、 green 、 yellow 、 blue 、 magenta 、 cyan、white

【2018深信服 醒狮计划】《Linux命令行与Shell脚本编程大全》学习笔记_第4张图片

4. 访问 Terminal

在一些Linux发行版的桌面环境中,例如UbuntuUnity,可以使用快捷键Ctrl+Alt+T快速访问GNOME终端

5. 好用的快捷键

天天使用

命令 备注
Ctrl+Shift+N 创建一个新Terminal
Copy Shift+Ctrl+C 复制
Shift+Ctrl+V 粘贴

第3章 基本的bash shell命令

大多数Linux发行版的默认shell都是GNU bash shell。

1. 查看手册

man

【2018深信服 醒狮计划】《Linux命令行与Shell脚本编程大全》学习笔记_第5张图片

如果不记得命令名怎么办?可以使用关键字搜索手册页

man -k 关键字

大多数命令都可以接受 -help--help 选项

2. 路径

Linux使用正斜线(/)而不是反斜线(\)在文件路径中划分目录。

3. linux文件结构

【2018深信服 醒狮计划】《Linux命令行与Shell脚本编程大全》学习笔记_第6张图片

4. 区分文件和目录 -F

如果没安装彩色终端仿真器,可用带 -F 参数的 ls 命令轻松区分文件和目录

ls -F

5. 隐藏文件显示 -a

ls -a

6. 递归选项 -R

ls -F -R

选项并不一定要像例子中那样分开输入: ls –F –R 。它们可以进行如下合并: ls –FR

7. 显示长列表 -l

显示更多的信息

ls -l

可以将多个参数结合起来使用。不仅能够显示出所需的内容,而且还容易记忆,例如 ls –alF

8. 过滤输出列表

过滤器就是一个进行简单文本匹配的字符串。当用户指定特定文件的名称作为过滤器时, ls 命令只会显示该文件的信息。

ls -l my_script
  • 问号( ? )代表一个字符;
  • 星号( * )代表零个或多个字符。
ls -l my_scr?pt
  • 通配符匹配

特定位置上可能出现的两种字符: a 或 i

ls -l my_scr[ai]pt

字母范围 [a – i]

ls -l f[a-i]ll

感叹号(!)将不需要的内容排除在外。

ls -l f[!a]ll

9. 文件操作

  • 创建
touch test_one
  • 复制
cp source destination

默认不会提示,加上-i提示覆盖

cp -i test_one test_two

10. 链接

  • 符号链接

可以使用 ln 命令以及 -s 选项来


创建符号链接

$ ls -l data_file
-rw-rw-r-- 1 christine christine 1092 May 21 17:27 data_file
$
$ ln -s data_file sl_data_file
$
$ ls -l *data_file
-rw-rw-r-- 1 christine christine 1092 May 21 17:27 data_file
lrwxrwxrwx 1 christine christine
9 May 21 17:29 sl_data_file -> data_file

证明链接文件是独立文件的方法是查看inode编号

$ ls -i *data_file
296890 data_file 296891 sl_data_file
  • 硬链接

硬链接会创建独立的虚拟文件,只不过这次使用 ln 命令时不再需要加入额外的参数了

$ ls -l code_file
-rw-rw-r-- 1 christine christine 189 May 21 17:56 code_file
$
$ ln code_file hl_code_file
$
$ ls -li *code_file
296892 -rw-rw-r-- 2 christine christine 189 May 21 17:56
code_file
296892 -rw-rw-r-- 2 christine christine 189 May 21 17:56
hl_code_file

复制链接文件的时候一定要小心。如果使用 cp 命令复制一个文件,而该文件又已经被链接
到了另一个源文件上,那么你得到的其实是源文件的一个副本。这很容易让人犯晕。


注意,带有硬链接的文件共享inode编号。这是因为它们终归是同一个文件。

11. 重命名

在Linux中,重命名文件称为移动(moving)。 mv 命令可以将文件和目录移动到另一个位置
或重新命名。

mv fall fzll

注意:移动文件会将文件名从fall更改为fzll,但inode编号和时间戳保持不变。这是因为 mv只影响文件名。


窍门:cp 命令类似,也可以在 mv 命令中使用 -i参数 。这样在命令试图覆盖已有的文件时,你就会得到提示

12. 删除文件

在Linux中,删除(deleting)叫作移除(removing)

rm -i fall

rm 命令的另外一个特性是,如果要删除很多文件且不受提示符的打扰,可以用 -f 参数强制删除。小心为妙!

12. 删除目录

rmdir New_Dir

13. 查看整个文件

cat test1

-n 参数会给所有的行加上行号

cat -n test1

只给有文本的行加上行号,可以用 -b 参数给有文本的行加上行号,可以用 -b 参数

cat -b test1

如果不想让制表符出现,可以用 -T 参数

cat -T test1
  • more,less

cat 或 more 加载完整个文件之后才能看到

  • tail 命令

tail 命令会显示文件最后几行的内容(文件的“尾部”)。默认情况下,它会显示文件的末尾10行。

cat log_file

通过加入 -n 2 使tail 命令只显示文件的最后两行

tail -n 2 log_file
  • head 命令

类似于 tail 命令,它也支持 -n 参数,这样就可以指定想要显示的内容了。这两个命令都允许你在破折号后面输入想要显示的行数

head -5 log_file

第4章 更多的bash shell

1. 监测程序

ps -l

UID:启动这些进程的用户。

  • PID:进程的进程ID。
  • PPID:父进程的进程号(如果该进程是由另一个进程启动的)。
  • C:进程生命周期中的CPU利用率。
  • STIME:进程启动时的系统时间。
  • TTY:进程启动时的终端设备。
  • TIME:运行进程需要的累计CPU时间。
  • CMD:启动的程序名称。

注意使用了 -l 参数之后多出的那些列。

  • F :内核分配给进程的系统标记。
  • S :进程的状态(O代表正在运行;S代表在休眠;R代表可运行,正等待运行;Z代表僵化,进程已结束但父进程已不存在;T代表停止)。
  • PRI :进程的优先级(越大的数字代表越低的优先级)。
  • NI :谦让度值用来参与决定优先级。
  • ADDR :进程的内存地址。
  • SZ :假如进程被换出,所需交换空间的大致大小。
  • WCHAN :进程休眠的内核函数的地址。

2. 实时监测进程

top

PID:进程的ID。

  • USER:进程属主的名字。
  • PR:进程的优先级。
  • NI:进程的谦让度值。
  • VIRT:进程占用的虚拟内存总量。
  • RES:进程占用的物理内存总量。
  • SHR:进程和其他进程共享的内存总量。
  • S:进程的状态(D代表可中断的休眠状态,R代表在运行状态,S代表休眠状态,T代表跟踪状态或停止状态,Z代表僵化状态)。
  • %CPU:进程使用的CPU时间比例。
  • %MEM:进程使用的内存占可用内存的比例。
  • TIME+:自进程启动到目前为止的CPU时间总量。
  • COMMAND:进程所对应的命令行名称,也就是启动的程序名

3. 结束进程

  • kill 命令 kill PID
  • killall 命令 ,通过进程名 ,killall http*
    以root用户身份登录系统时,使用 killall 命令要特别小心,因为很容易就会误用通配符而结束了重要的系统进程。这可能会破坏文件系统。

4. 监测磁盘空间

  • mount 命令 mount -t type device directory,
    • vfat:Windows长文件系统。
    • ntfs:Windows NT、XP、Vista以及Windows 7中广泛使用的高级文件系统。
    • iso9660:标准CD-ROM文件系统。
mount -t vfat /dev/sdb1 /media/disk
  • umount 命令 umount [directory | device ]
umount /home/rich/mnt
  • df 命令 获取设备上还有多少磁盘空间
    说明 Linux系统后台一直有进程来处理文件或使用文件。 df 命令的输出值显示的是Linux系统认为的当前值。有可能系统上有运行的进程已经创建或删除了某个文件,但尚未释放文件。这个值是不会算进闲置空间的。

  • du 命令可以显示某个特定目录(默认情况下是当前目录)的磁盘使用情况。这一方法可用来快速判断系统上某个目录下是不是有超大文件。

  • 处理数据文件

    • 排序数据 ,按字符,cat file1
    • sort 命令把数字识别成数字而不是字符 sort -n file2
    • 管道命令( | )将 du 命令的输出重定向到 sort 命令。
  • 搜索数据 grep [options] pattern [file]

在文件 file1 中搜索能匹配模式 three 的文本

grep three file1

反向搜索

grep -v t file1
  • 压缩数据

【2018深信服 醒狮计划】《Linux命令行与Shell脚本编程大全》学习笔记_第7张图片

gzip 用来压缩文件

gzip myprog
  • 归档数据

tar 命令

tar function [options] object1 object2 ...

【2018深信服 醒狮计划】《Linux命令行与Shell脚本编程大全》学习笔记_第8张图片

下载了开源软件之后,你会经常看到文件名以.tgz结尾。这些是 gzip 压缩过的tar文件可以用命令 tar -zxvf filename.tgz 来解压。

day2


第5章 理解shell

1. 启动dash shell

/bin/dash

2. 子shell

在CLI提示符后输入 /bin/bash 命令或其他等效的 bash 命令时,会创建一个新的shell程序。这个shell程序被称为子shell(child shell)。子shell也拥有CLI提示符,同样会等待命令输入。

【2018深信服 醒狮计划】《Linux命令行与Shell脚本编程大全》学习笔记_第9张图片

输入 exit 来退出dash shell

说明:

进程就是正在运行的程序。bash shell是一个程序,当它运行的时候,就成为了一个进程。一个运行着的shell就是某种进程而已。因此,在说到运行一个bash shell的时候,你经常会看到“shell”“进程”这两个词交换使用。

3. shell间的嵌套结构

【2018深信服 醒狮计划】《Linux命令行与Shell脚本编程大全》学习笔记_第10张图片

4. 后台模式

  • sleep 10 暂停10秒钟,然后返回shell CLI提示符
  • jobs 命令来显示后台作业信息

5. 协程

协程可以同时做两件事。它在后台生成一个子shell,并在这个子shell中执行命令

coproc sleep 10

扩展写法,协程的名字被设置成 My_Job

coproc My_Job { sleep 10; }

协程能够让你尽情发挥想象力,发送或接收来自子shell中进程的信息。只有在拥有多个协程的时候才需要对协程进行命名,因为你得和它们进行通信。否则的话,让 coproc 命令将其设置成默认的名字 COPROC 就行了

coproc ( sleep 10; sleep 2 )

【2018深信服 醒狮计划】《Linux命令行与Shell脚本编程大全》学习笔记_第11张图片

生成子shell的成本不低,而且速度还慢。创建嵌套子shell更是火上浇油

6. 外部命令

当外部命令执行时,会创建出一个子进程。这种操作被称为衍生(forking)。外部命令 ps 很方便显示出它的父进程以及自己所对应的衍生子进程。

【2018深信服 醒狮计划】《Linux命令行与Shell脚本编程大全》学习笔记_第12张图片

就算衍生出子进程或是创建了子shell,你仍然可以通过发送信号与其沟通,这一点无论是在命令行还是在脚本编写中都是极其有用的。发送信号(signaling)使得进程间可以通过信号进行通信。

7. 内建命令

cd 和 exit 命令都内建于bash shell

$ type cd
cd is a shell builtin
$
$ type exit
exit is a shell builtin

因为既不需要通过衍生出子进程来执行,也不需要打开程序文件,内建命令的执行速度要更快,效率也更高

例如 echo 和 pwd 既有内建命令也有外部命令。两种实现略有不同。要查看命令的不同实现,使用 type 命令的 -a 选项

对于有多种实现的命令,如果想要使用其外部命令实现,直接指明对应的文件就可以了。例如,要使用外部命令 pwd ,可以输入 /bin/pwd

8. history

如果你打开了多个终端会话,仍然可以使用history -a命令在打开的会话中向.bash_history文件中添加记录。但是对于其他打开的终端会话,历史记录并不会自动更新。这是因为.bash_history文件只有在打开首个终端会话时才会被读取。要想强制重新读取.bash_history文件,更新终端会话的历史记录,可以使用下面命令。

history -n

第6章 使用Linux环境变量

1. 查看全局变量

printenv

printenv HOME

env HOME

2. 局部环境变量

set 命令会显示为某个特定进程设置的所有环境变量

命令 envprintenvset 之间的差异很细微。 set 命令会显示出全局变量、局部变量以及用户定义变量。它还会按照字母顺序对结果进行排序envprintenv 命令同 set 命令的区别在于前两个命令不会对变量排序,也不会输出局部变量和用户定义变量。在这种情况下, envprintenv 的输出是重复的。不过 env 命令有一个 printenv 没有的功能,这使得它要更有用一些。

3. 设置局部用户定义变量

$ echo $my_variable
$ my_variable=Hello
$
$ echo $my_variable
Hello

窍门:

所有的环境变量名均使用大写字母,这是bash shell的标准惯例。如果是你自己创建的局部变量或是shell脚本,请使用小写字母。变量名区分大小写。在涉及用户定义的局部变量时坚持使用小写字母,这能够避免重新定义系统环境变量可能带来的灾难。

4. 设置全局环境变量

$ my_variable="I am Global now"
$
$ export my_variable
$
$ echo $my_variable
I am Global now
$
$ bash
$
$ echo $my_variable
I am Global now
$
$ exit
exit
$
$ echo $my_variable
I am Global now

修改子shell中全局环境变量并不会影响到父shell中该变量的值,子shell甚至无法使用 export 命令改变父shell中全局环境变量的值

5. 删除环境变量

$ echo $my_variable
I am Global now
$ unset my_variable
$ echo $my_variable

如果你是在子进程中删除了一个全局环境变量,这只对子进程有效。该全局环境变量在父进程中依然可用

6. 设置 PATH 环境变量

echo $PATH

7. 登录 shell

当你登录Linux系统时,bash shell会作为登录shell启动。登录shell会从5个不同的启动文件里读取命令:

  • /etc/profile
  • $HOME/.bash_profile
  • $HOME/.bashrc
  • $HOME/.bash_login
  • $HOME/.profile

/etc/profile文件是系统上默认的bash shell的主启动文件。系统上的每个用户登录时都会执行这个启动文件。

8. 交互式 shell 进程

如果bash是作为交互式shell启动的,它就不会访问/etc/profile文件,只会检查用户HOME目录中的.bashrc文件

9. 非交互式 shell

系统执行shell脚本时用的就是这种shell。不同的地方在于它没有命令行提示符。但是当你在系统上运行脚本时,也许希望能够运行一些特定启动的命令。

10. 环境变量持久化

在大多数发行版中,存储个人用户永久性bash shell变量的地方是$HOME/.bashrc文件。这一
点适用于所有类型的shell进程。

11. 数组变量

$ mytest=(one two three four five)
$ echo $mytest
one
$ echo ${mytest[2]}
three

第7章 理解Linux文件权限

1. Linux 的安全性

Linux系统使用一个专门的文件来将用户的登录名匹配到对应的UID值

cat /etc/passwd

现在,绝大多数Linux系统都将用户密码保存在另一个单独的文件中(叫作shadow文件,位置
在/etc/shadow)。只有特定的程序(比如登录程序)才能访问这个文件。


/etc/shadow文件对Linux系统密码管理提供了更多的控制。只有root用户才能访问/etc/shadow文件,这让它比起/etc/passwd安全许多在/etc/shadow文件的每条记录中都有9个字段:

  • 与/etc/passwd文件中的登录名字段对应的登录名
  • 加密后的密码
  • 自上次修改密码后过去的天数密码(自1970年1月1日开始计算)
  • 多少天后才能更改密码
  • 多少天后必须更改密码
  • 密码过期前提前多少天提醒用户更改密码
  • 密码过期后多少天禁用用户账户
  • 用户账户被禁用的日期(用自1970年1月1日到当天的天数表示)1
  • 预留字段给将来使用

2. 添加新用户

/usr/sbin/useradd -D

3. 删除用户

/usr/sbin/userdel -r test

在有大量用户的环境中使用 -r 参数时要特别小心。你永远不知道用户是否在其HOME目录下存放了其他用户或其他程序要使用的重要文件。记住,在删除用户的HOME目录之前一定要检查清楚!

4. 修改用户

  • usermod 命令是用户账户修改工具中最强大的一个

    • -l 修改用户账户的登录名。
    • -L 锁定账户,使用户无法登录。
    • -p 修改账户的密码。
    • -U 解除锁定,使用户能够登录。
  • passwd 和 chpasswd改变用户密码的一个简便方法就是用 passwd 命令

passwd username
  • chsh 、 chfn 和 chage工具专门用来修改特定的账户信息
chsh -s /bin/csh username

5. 查看用户

finger 命令可以非常方便地查看Linux系统上的用户信息

finger username

出于安全性考虑,很多Linux系统管理员会在系统上禁用 finger 命令,不少Linux发行版甚至都没有默认安装该命令。

6. 使用 Linux 组

用户账户在控制单个用户安全性方面很好用,但涉及在共享资源的一组用户时就捉襟见肘
了。为了解决这个问题,Linux系统采用了另外一个安全概念——组(group)。


与用户账户类似,组信息也保存在系统的一个文件中。/etc/group文件包含系统上用到的每个
组的信息。

root:x:0:root
bin:x:1:root,bin,daemon
daemon:x:2:root,bin,daemon
sys:x:3:root,bin,adm
adm:x:4:root,adm,daemon
rich:x:500:
mama:x:501:
katie:x:502:
jessica:x:503:
mysql:x:27:
test:x:504:

/etc/group文件有4个字段:

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

用户账户列表某种意义上有些误导人。你会发现,在列表中,有些组并没有列出用户。这并不是说这些组没有成员。当一个用户在/etc/passwd文件中指定某个组作为默认组时,用户账户不会作为该组成员再出现在/etc/group文件中。多年以来,被这个问题难倒的系统管理员可不是一两个呢。

7. 创建新组

/usr/sbin/groupadd shared
/usr/sbin/usermod -G shared rich

8. 修改组

/usr/sbin/groupmod -n sharing shared

9. 文件权限

【2018深信服 醒狮计划】《Linux命令行与Shell脚本编程大全》学习笔记_第13张图片

10. 改变权限

两个修改权限的方式chmodumask

chmod options mode file

chmod 760 newfile

umask 002

11. 改变所属关系

chown 命令用来改变文件的属主,chgrp 命令用来改变文件的默认属组。

chown options owner[.group] file

chown dan newfile
chgrp shared newfile

12. 共享文件

SGID位置位

umask 002

【2018深信服 醒狮计划】《Linux命令行与Shell脚本编程大全》学习笔记_第14张图片

如果更改了已登录系统账户所属的用户组,该用户必须登出系统后再登录,组关系的更改才能生效。

第8章 管理文件系统

1. ext文件系统

扩展文件系统 (extended filesystem,简记为ext),ext文件系统采用名为索引节点的系统来存放虚拟目录中所存储文件的信息

2. ext2文件系统

最早的ext文件系统有不少限制,比如文件大小不得超过2 GB。在Linux出现后不久,ext文件
系统就升级到了第二代扩展文件系统,叫作ext2。ext2文件系统还将允许的最大文件大小增加到了2 TB(在ext2的后期版本中增加到了32 TB),以容纳数据库服务器中常见的大文件。

3. 日志文件系统

数据模式日志方法是目前为止最安全的数据保护方法,但同时也是最慢的。所有写到存储设
备上的数据都必须写两次:第一次写入日志,第二次写入真正的存储设备。这样会导致性能很差,
尤其是对要做大量数据写入的系统而言。

4. ext3文件系统

2001年,ext3文件系统被引入Linux内核中,直到最近都是几乎所有Linux发行版默认的文件
系统。它采用和ext2文件系统相同的索引节点表结构,但给每个存储设备增加了一个日志文件,
以将准备写入存储设备的数据先记入日志。

5. ext4文件系统

扩展ext3文件系统功能的结果是ext4文件系统(你可能也猜出来了)。ext4文件系统在2008年受到Linux内核官方支持,现在已是大多数流行的Linux发行版采用的默认文件系统,比如Ubuntu


ext4还引入了块预分配技术(block preallocation)。如果你想在存储设备上给一个你知道要变
大的文件预留空间,ext4文件系统可以为文件分配所有需要用到的块,而不仅仅是那些现在已经
用到的块。ext4文件系统用 0 填满预留的数据块,不会将它们分配给其他文件。

6. Reiser文件系统

2001年,Hans Reiser为Linux创建了第一个称为ReiserFS的日志文件系统。ReiserFS文件系统只支持回写日志模式——只把索引节点表数据写到日志文件。 ReiserFS文件系统也因此成为Linux
上最快的日志文件系统之一。

7. JFS文件系统

作为可能依然在用的最老的日志文件系统之一,JFS(Journaled File System,日志化文件系
1统 )是IBM在1990年为其Unix衍生版AIX开发的。

8. XFS文件系统

XFS日志文件系统是另一种最初用于商业Unix系统而如今走进Linux世界的文件系统。美国
硅图公司(SGI)最初在1994年为其商业化的IRIX Unix系统开发了XFS。2002年,它被发布到了
适用于Linux环境的版本。


9. ZFS文件系统

COW文件系统ZFS是由Sun公司于2005年研发的,用于OpenSolaris操作系统,从2008年起开
始向Linux移植,最终在2012年投入Linux产品的使用。

10. Btrf文件系统

Btrfs文件系统是COW的新人,也被称为B树文件系统。它是由Oracle公司于2007年开始研发
的。Btrfs在Reiser4的诸多特性的基础上改进了可靠性。另一些开发人员最终也加入了开发过程,
帮助Btrfs快速成为了最流行的文件系统。

11. 创建分区

sudo fdisk /dev/sdb
命令 描述
a 设置活动分区标志
b 编辑BSD Unix系统用的磁盘标签
c 设置DOS兼容标志
d 删除分区
l 显示可用的分区类型
m 显示命令选项
n 添加一个新分区
o 创建DOS分区表
p 显示当前分区表
q 退出,不保存更改
s 为Sun Unix系统创建一个新磁盘标签
t 修改分区的系统ID
u 改变使用的存储单位
v 验证分区表
w 将分区表写入磁盘
x 高级功能

如果这是你第一次给该存储设备分区, fdisk 会警告你设备上没有分区表。

12. 创建文件系统

创建文件系统的命令行程序

sudo mkfs.ext4 /dev/sdb1

sudo mount -t ext4 /dev/sdb1
工具 用途
mkefs 创建一个ext文件系统
mke2fs 创建一个ext2文件系统
mkfs.ext3 创建一个ext3文件系统
mkfs.ext4 创建一个ext4文件系统
mkreiserfs 创建一个ReiserFS文件系统
jfs_mkfs 创建一个JFS文件系统
mkfs.xfs 创建一个XFS文件系统
mkfs.zfs 创建一个ZFS文件系统
mkfs.btrfs 创建一个Btrfs文件系统

这种挂载文件系统的方法只能临时挂载文件系统。当重启Linux系统时,文件系统并不会自动挂载。要强制Linux在启动时自动挂载新的文件系统,可以将其添加到/etc/fstab文件。

13. 文件系统的检查与修复

fsck options filesystem

fsck 的命令行选项

选项 描述
-a 如果检测到错误,自动修复文件系统
-A 检查/etc/fstab文件中列出的所有文件系统
-C 给支持进度条功能的文件系统显示一个进度条(只有ext2和ext3)
-N 不进行检查,只显示哪些检查会执行
-r 出现错误时提示
-R 使用 -A 选项时跳过根文件系统
-s 检查多个文件系统时,依次进行检查
-t 指定要检查的文件系统类型
-T 启动时不显示头部信息
-V 在检查时产生详细输出
-y 检测到错误时自动修复文件系统

只能在未挂载的文件系统上运行 fsck 命令。对大多数文件系统来说,你只需卸载文件系
统来进行检查,检查完成之后重新挂载就好了。但因为根文件系统含有所有核心的Linux
命令和日志文件,所以你无法在处于运行状态的系统上卸载它。

尽管日志式文件系统的用户需要用到 fsck 命令,但是COW文件系统的用户是否也得使用该命令还存在争议。实际上,ZFS文件系统甚至都没有提供 fsck 工具的接口

14. 逻辑卷管理布局

逻辑卷管理的核心在于如何处理安装在系统上的硬盘分区。在逻辑卷管理的世界里,硬盘称
作物理卷(physical volume,PV)

【2018深信服 醒狮计划】《Linux命令行与Shell脚本编程大全》学习笔记_第15张图片

15. Linux 中的 LVM

  • 快照
  • 条带化
  • 镜像

16. 使用 Linux LVM

分区来创建实际的物理卷。这可以通过 pvcreate 命令来完成

sudo pvcreate /dev/sdb1

可以使用 pvdisplay 命令来显示已创建的物理卷列表

sudo pvdisplay /dev/sdb1

命令行创建卷组,需要使用 vgcreate 命令

sudo vgcreate Vol1 /dev/sdb1

要创建逻辑卷,使用 lvcreate 命令

sudo lvcreate -l 100%FREE -n lvtest Vol1

运行完 lvcreate 命令之后,逻辑卷就已经产生了,但它还没有文件系统。你必须使用相应
的命令行程序来创建所需要的文件系统。

sudo mkfs.ext4 /dev/Vol1/lvtest

可以用标准Linux mount 命令将这个卷挂载到虚拟目录中,就
跟它是物理分区一样

sudo mount /dev/Vol1/lvtest /mnt/my_partition

17. 修改LVM

命令 功能
vgchange 激活和禁用卷组
vgremove 删除卷组
vgextend 将物理卷加到卷组中
vgreduce 从卷组中删除物理卷
lvextend 增加逻辑卷的大小
lvreduce 减小逻辑卷的大小

通过使用这些命令行程序,就能完全控制你的Linux LVM环境

day3


第9章 安装软件程序

1. aptitude 管理软件包

aptitude
  • 列出软件包安装的文件
dpkg -L package_name
dpkg -L vim-common
  • aptitude 更新软件
aptitude safe-upgrade
  • aptitude 卸载软件

要想只删除软件包而不删除数据和配置文件,可以使用 aptitude 的remove 选项。要删除软件包和相关的数据和配置文件,可用 purge 选项。

sudo aptitude purge wine

2. 基于 Red Hat 的系统

  • 常见的前端工具

    • yum :在Red Hat和Fedora中使用。
    • urpm :在Mandriva中使用。
    • zypper :在openSUSE中使用。
  • 列出已安装包

yum list installed
  • yum 更新软件
yum list updates

yum update
  • yum 卸载软件

只删除软件包而保留配置文件和数据文件,就用如下命令:

yum remove package_name

要删除软件和它所有的文件,就用 erase 选项:

yum erase package_name
  • 处理损坏的包依赖关系

试试下面的命令:

yum clean all

然后试着用 yum 命令的 update 选项。有时,只要清理了放错位置的文件就可以了。如果这还解决不了问题,试试下面的命令:

yum deplist package_name

如果这样仍未解决问题,还有最后一招:

yum update --skip-broken

–skip-broken 选项允许你忽略依赖关系损坏的那个包,继续去更新其他软件包。这可能救不了损坏的包,但至少可以更新系统上的其他包。

3. yum 软件仓库

聪明的系统管理员会坚持使用通过审核的仓库。通过审核的仓库是指该发行版官方网站上指定的库。如果你添加了未通过审核的库,就失去了稳定性方面的保证,可能陷入损坏的依赖关系惨剧中

第10章 使用编辑器

1. vim编辑命令

命令 描述
x 删除当前光标所在位置的字符
dd 删除当前光标所在行
dw 删除当前光标所在位置的单词
d$ 删除当前光标所在位置至行尾的内容
J 删除当前光标所在行行尾的换行符(拼接行)
u 撤销前一编辑命令
a 在当前光标后追加数据
A 在当前光标所在行行尾追加数据
r char 用 char 替换当前光标所在位置的单个字符
R text 用 text 覆盖当前光标所在位置的数据,直到按下ESC键

在vim编辑器的普通模式下使用退格键(Backspace键)和删除键(Delete键)时要留心。vim编辑器通常会将删除键识别成 x 命令的功能,删除当前光标所在位置的字符。vim编辑器在普通模式下通常不识别退格键。

2. nano 编辑器

vim是一款复杂的编辑器,功能强大,而nano就简单多了。作为一款简单易用的控制台模式文本编辑器,nano很适合对此类编辑器有需求的用户。对Linux命令行新手来说,它用起来也很不错。

nano myprog.c

尽管nano控制命令在列出组合键的时候使用的是大写字母,但是在使用的时候,大小写字母都没有问题。


nano控制命令

命令 描述
CTRL+C 显示光标在文本编辑缓冲区中的位置
CTRL+G 显示nano的主帮助窗口
CTRL+J 调整当前文本段落
CTRL+K 剪切文本行,并将其保存在剪切缓冲区
CTRL+O 将当前文本编辑缓冲区的内容写入文件
CTRL+R 将文件读入当前文本编辑缓冲区
CTRL+T 启动可用的拼写检查器
CTRL+U 将剪切缓冲区中的内容放入当前行
CTRL+V 翻动到文本编辑缓冲区中的下一页内容
CTRL+W 在文本编辑缓冲区中搜索单词或短语
CTRL+X 关闭当前文本编辑缓冲区,退出nano,返回shell
CTRL+Y 翻动到文本编辑缓冲区中的上一页内容

如果你输入Ctrl+T命令使用nano的拼写检查器的时候得到了错误消息 Spell checking failed: Error invoking ‘Spell’ ,下面是一些解决方法。利用第9章中学到的知识,在你使用的Linux发行版中安装拼写检查器软件包aspell。如果aspell没能解决问题,以超级用户的身份编辑/etc/nanorc文件(使用你喜欢的文本编辑器)。找到文件的最后一行 # set speller “aspell -x -c” ,删除行首的字符 # 。保存并退出。

第二部分 shell 脚本编程基础

第11章 构建基本脚本

1. 创建 shell 脚本文件

创建test1,输入下面,保存

#!/bin/bash
# This script displays the date and who's logged on
date
who

加权限

chmod u+x test1

运行

sudo ./test1

2. 显示消息

$ echo This is a test
This is a test
$

3. 创建log命名

#!/bin/bash
# copy the /usr/bin directory listing to a log file
today=$(date +%y%m%d)
ls /usr/bin -al > log.$today    
date +%y%m%d

目录中出现的日志文件采用 $today 变量的值作为文件名的一部分。日志文件的内容是/usr/bin目录内容的列表输出。如果脚本在明天运行,日志文件名会是log.180506,就这样为新的一天创建一个新文件。

命令替换会创建一个子shell来运行对应的命令。子shell ( subshell)是由运行该脚本的shell所创建出来的一个独立的子shell(child shell)。正因如此,由该子shell所执行命令是无法使用脚本中所创建的变量的。在命令行提示符下使用路径 ./ 运行命令的话,也会创建出子shell;要是运行命令的时候不加入路径,就不会创建子shell。如果你使用的是内建的shell命令,并不会涉及子shell。在命令行提示符下运行脚本时一定要留心!

4. 输出重定向

command > outputfile

5. 输入重定向

command < inputfile

6. 管道

管道被放在命令之间,将一个命令的输出重定向到另一个命令中:

command1 | command2

7. 查看退出状态码

$ date
Sat Jan 15 10:01:30 EDT 2014
$ echo $?
0
$

第12章 使用结构化命令

1. if-then 语句

if command
then
    commands
fi

bash shell的 if 语句会运行 if 后面的那个命令。如果该命令的退出状态码(参见第11章)是 0(该命令成功运行),位于 then 部分的命令就会被执行。如果该命令的退出状态码是其他值,部分的命令就不会被执行,bash shell会继续执行脚本中的下一个命令。 fi 语句用来表示 if-then语句到此结束。

2. if-then-else 语句

if command
then
    commands
else
    commands
fi

3. test 命令

test condition

4. 检查文件日期 -nt

if [ test19.sh -nt test18.sh ]

day4


第13章 更多的结构化命令

1. for 命令

for var in list
do
    commands
done

2. while 的基本格式

while test command
do
    other commands
done

3. until 命令

until test commands
do
    other commands
done

4. 控制循环


  • break 命令

有时你在内部循环,但需要停止外部循环。 break 命令接受单个命令行参数值
break n

其中 n 指定了要跳出的循环层级。默认情况下, n 为 1 ,表明跳出的是当前的循环。


  • continue 命令

和 break 命令一样, continue 命令也允许通过命令行参数指定要继续执行哪一级循环:
continue n

5. 查找可执行文件

IFS=:
for folder in $PATH
do

第14章 处理用户输入

第15章 呈现数据

第16章 控制脚本

day5


第三部分 高级 shell 脚本编程

第17章 创建函数

第18章 图形化桌面环境中的脚本编程

第19章 初识sed和gawk

第20章 正则表达式

day6


第21章 sed进阶

第22章 gawk进阶

第23章 使用其他shell

第四部分 创建实用的脚本

第24章 编写简单的脚本实用工具

day7


第25章 创建与数据库、Web及电子邮件相关的脚本

第26章 一些小有意思的脚本

附录A bash命令快速指南

附录B sed和gawk快速指南

你可能感兴趣的:(Linux)