Linux系统命令及Shell脚本实践指南

王军

推荐序2

  • 在提升用户体验的过程中,有三点极其重要:一是稳定,不能频繁宕机;二是要快,天下武功,唯快不破;三是界面友好,不能半天找不到操作按钮—这些都是与精湛的技术密不可分的。

第1章 Linux简介

  • Linux是一种类UNIX的系统

1.2 Linux的特点

  • 模块化程度高。Linux的内核设计分成进程管理、内存管理、进程间通信、虚拟文件系统、网络5部分,

1.3 系统安装

  • 其内核都是来自Linux内核官网(www.kernel.org)
  • 什么是交换分区?交换分区是一个特殊的分区,它的作用相当于Windows下的虚拟内存,这个分区的大小一般设置为物理内存的两倍,但是不管物理内存有多大,交换分区建议不要超过8GB,因为大于8GB的交换分区其实并没有多大实际意义。
  • 如果想用字符模式安装,需要输入linux text,然后按回车键。

1.4 系统登录

  • 终端模式又称为命令行模式或字符模式,默认情况下Linux提供6个终端,可以使用组合键Ctrl+Alt+F1进入第一个终端,使用组合键Ctrl+Alt+F2进入第二个终端,其他终端的组合键以此类推。实际上,终端又叫tty,Linux系统定义了6个tty,分别从tty1到tty6。tty是Teletype的简写,Teletype是最早出现的一种终端设备,很像电传打字机。在Linux系统中,在特殊文件目录/dev下有一些文件与之对应,比如/dev/tty1、/dev/tty2等,从tty1到tty6又称为虚拟终端。如果想回到桌面模式,只需要使用组合键Ctrl+Alt+F7即可。
  • “~”是用户home目录(又叫“用户家目录”)的简写。最后的 “#”是一个提示符,出现“#”说明目前的用户是有超级权限的root用户,而一般用户的提示符是“$”。
  • 1.显示日期:date
  • Linux下的命令是严格区分大小写的
  • 2.列出目录内容:ls
  • ls-l的作用是详细显示当前目录下的所有文件。
  • 3.显示文件内容:cat
  • 部分命令后面可以直接回车。部分命令后面可以跟上特定的“选项”作为该命令的参数。不同的命令所能跟的参数以及参数的个数一般不同。

1.5 系统启动流程

  • 运行级0:关机。 运行级1:单用户模式,系统出现问题时可使用这种模式进入系统维护,典型的使用场景是在忘记root密码时可进入此模式修改root密码。 运行级2:多用户模式,但是没有网络连接。 运行级3:完全多用户模式,这也是Linux服务器最常见的运行级。 运行级4:保留未使用。 运行级5:窗口模式,支持多用户,支持网络。 运行级6:重启。
  • K和S的意思分别是停止(kill)和启动(start),只要定义好不同运行级需要启动和停止的服务,就可以让系统在不同的运行级下启动和关闭不一样的服务。
  • Grub的启动是分成两段完成的。第一段以stage1作为主引导程序,它的主要任务是定位和装载第二段引导程序,并转交控制权,即stage2。
  • 对Grub的配置可以通过修改Grub的配置文件完成,一般配置文件为/boot/grub/grub. conf。
  • initrd文件,其英文含义是boot loader initialized RAM disk,也就是bootloader用于初始化的内存磁盘,是系统启动时的临时文件系统,kernel通过读取initrd来获得各种可执行文件和设备驱动,并挂载真实的文件系统,然后卸载这个临时文件系统

1.6 获得帮助

  • 比如说在man ls的页面上,输入“/time”,按回车键,就可以看到关键字被标记了。可以按小写字母n向下查找,也可以按大写的N向上查找,按小写字母q可以结束查看man文件。
  • 可以使用man-f来查询要找的命令存在于哪些man文件中
  • 可以按空格键向下翻页,按PageUp、PageDown键上下翻页,按q键退出info查询。
  • 在/usr/share/doc中,也有大量的帮助和说明文档,可以供日常查询参考。

第2章 Linux用户管理

  • Linux是一个多用户分时系统
  • Linux系统中的用户分为3类,即普通用户、根用户、系统用户。
  • 这种用于区分不同用户组的ID被称为Group ID,也就是GID。
  • 要确认自己的UID,可以使用以下id命令来获得:

2.2 Linux账号管理

  • Linux用户按照使用方式分为三种:一是根用户,二是系统用户,三是普通用户。
  • 如果你使用ls-l /etc/skel命令查看,可以发现这个目录下“什么都没有”,但事实上,该目录下面有很多隐藏文件,使用命令ls-la /etc/skel就可以看到其中还是有好几个文件的。
  • 使用-d参数指定该用户的家目录
  • 修改密码:passwd
  • 与root用户使用这个命令的方式不同,普通用户在运行这个命令时,后面不能跟参数,哪怕是自己的用户名也不行。比如说使用john登录,然后采用passwd john命令,系统就会立刻报错,提示只有root用户才可以在后面跟上用户名
  • 3.修改用户:usermod
  • -m参数的作用是,如果指定用户的家目录存在,就自动创建新目录/home/alice_new,并使用该目录作为alice的新家目录。
  • 需要暂时将这个账号冻结起来,这时,可以使用-L参数实现此目的
  • 使用-U参数可以解锁,而且可以看到密码又恢复如从前了。
  • 默认情况下,删除用户时并不会删除原来用户的家目录和邮件信息。可以使用-r参数同时删除用户家目录和该用户的邮件
  • 增加用户组:groupadd
  • 删除用户组:groupdel
  • 查看用户:users、who、w

2.3 切换用户

  • 两种切换用户的方法:su和sudo
  • Linux提供了专门编辑这个文件的方式,就是使用命令visudo来编辑这个文件,它的好处是可以在编辑后保存退出时自动检查语法设置,以防止不小心配置错误而造成无法使用sudo命令。
  • sudo并不是真的切换了用户,而是使用其他用户的身份和权限执行了命令。

2.4 例行任务管理

  • 如果任务是周期性执行的,其命令为cron;如果只是在某一个特定的时间执行一次,其命令为at。
  • q命令查看当前使用at命令调度的任务列表,第一列是任务编号;也可以使用atrm删除已经进入任务队列的任务,再使用at

第3章 Linux文件管理

  • FHS(文件系统层次标准)定义了在根目录下的主要目录以及每个目录应该存放什么文件。
  • 在每个目录下,都会固定存在两个特殊目录,分别是一个点(.)和两个点(..)的目录。一个点(.)代表的是当前目录,两个点(..)代表的是当前目录的上层目录。在Linux下,所有以点开始的文件都是“隐藏文件”,对于这类文件,只使用命令ls-l是看不到的,必须要使用ls-la才可以看到,如下所示:
  • 7.文件格式转换:dos2unix该命令是DOS to UNIX的简写,也许你从字面上可以大概猜到它的作用,就是可以把DOS格式的文本文件转变成UNIX下的文本文件。
  • 2.创建目录:mkdir
  • 可以使用-p参数一次性创建所有目录,这样就不用费力地一个个创建了
  • 几乎所有的程序都会读写系统文件,默认情况下,一旦发生写文件操作,该文件的时间戳将会立刻得到更新。因此可以利用这种特性来有选择性地备份一些文件(又叫差异备份)
  • 下次备份的时候,只需要找出比time_stamp文件时间戳新的文件,然后备份该文件即可

3.2 文件和目录的权限

  • Linux系统之所以更安全,是因为对文件权限有着非常严格的控制。
  • 第二列代表“连接数”,除了目录文件之外,其他所有文件的连接数都是1,目录文件的连接数是该目录中包含其他目录的总个数+2,也就是说,如果目录A中包含目录B和C,则目录A的连接数为4。
  • 如果需要修改的不是一个文件而是一个目录,以及该目录下所有的文件、子目录、子目录下所有的文件和目录(即递归设置该目录下所有的文件和目录的拥有者是john),则需要使用-R参数,也就是chown-R john somedir;如果要同时修改用户组为john,则使用chown-R john:john somedir。
  • Sticky权限只能用于设置在目录上,设置了这种权限的目录,任何用户都可以在该目录中创建或修改文件,但是只有该文件的创建者和root可以删除自己的文件
  • 文件的权限默认是644,目录的默认权限是755。
  • 对于root用户,文件的默认权限是644,目录的默认权限是755;对于普通用户,文件的默认权限是664,目录的默认权限是775。

3.3 查找文件

  • 假设需要在系统中找到一个名为httpd.conf的文件,可以这么写: 
[root@localhost ~]# find /-name httpd.conf 这条命令的意思是,从根目录开始寻找名为httpd.conf的文件
  • 使用whereis也能查到其路径,但是和which不同的是,它不但能找出其二进制文件,还能找出相关的man文件:

3.4 文件压缩和打包

  • 文本类的日志文件之压缩比往往能达到80%~90%
  • gzip/gunzip是用来压缩和解压缩单个文件的工具

第4章 Linux文件系统

  • 文件系统是操作系统用于明确磁盘或分区上相关文件的方法和数据结构,通俗的说法就是在磁盘上组织文件的方法。
  • 因为日志文件系统使用了“两阶段提交”的方式来维护待处理的事务。比方说在写入数据之前,文件系统会先在日志中写入相关记录信息,然后再开始真实地写数据,写完数据后则会将之前写入日志中的内容删除。

4.2 磁盘分区、创建文件系统、挂载

  • 受限制于磁盘的分区表大小(MBR大小为512字节,其中分区表占64字节),由于每个分区信息使用16字节,所以一块磁盘最多只能创建4个主分区,为了能支持更多分区,可以使用扩展分区(扩展分区中可以划分更多逻辑分区)

4.3 Linux逻辑卷

  • 为了更好地使用磁盘空间,提高系统空间的可扩展性,此时就需要使用逻辑卷。
  • 逻辑卷就是使用逻辑卷组管理(Logic Volume Manager)创建出来的设备,也是Linux操作系统可以认识的设备。

4.4 硬链接和软链接

  • 不允许给目录创建硬链接;只有在同一文件系统中的文件之间才能创建链接,即不同分区上的两个文件之间不能够建立硬链接。

第5章 字符处理

  • 在Linux中也存在着管道,它是一个固定大小的缓冲区,该缓冲区的大小为1页,即4K字节。

5.2 使用grep搜索文本

  • grep是Linux下非常强大的基于行的文本搜索工具,使用该工具时,如果匹配到相关信息就会打印出符合条件的所有行。
  • 由于grep区分大小写,所以虽然第二行中含有大写的NAME,但是也不会匹配到。如果希望忽略大小写,可以加上-i参数
  • 如果想打印出文件中不包含name的行,可以使用grep的反选参数-v

5.3 使用sort排序

  • [root@localhost ~]# sort [-ntkr] 文件名#-n采取数字排序#-t指定分隔符#-k指定第几列#-r反向排序
  • 对输出内容直接排序时,默认按照每行的第一个字符进行排序
  • 如果想要指定按照“数字”的方式进行排序,则需要加上-n参数。

5.4 使用uniq删除重复内容

  • 使用uniq删除重复内容
  • uniq一般都需要和sort命令一起使用,也就是先将文件使用sort进行排序(这样重复的内容就能显示在连续的几行中),然后再使用uniq删除掉重复的内容(uniq的作用就在于删除连续的完全一致的行)

5.5 使用cut截取文本

  • cut-f指定的列-d'分隔符'
  • cut-c指定列的字符

5.6 使用tr做文本转换

  • tr命令比较简单,其主要作用在于文本转换或删除。

5.7 使用paste做文本合并

  • paste的作用在于将文件按照行进行合并,中间使用tab隔开。

5.8 使用split分割大文件

  • 在Linux下使用split命令来实现文件的分割,支持按照行数分割和按照大小分割这两种模式。

6.1 网络接口配置

  • 如果不使用任何参数,输入ifconfig命令时将会输出当前系统中所有处于活动状态的网络接口

6.2 路由和网关设置

  • 在Linux中可使用route命令添加默认网关

6.3 DNS客户端配置

  • hosts文件的作用主要如下:加快域名解析。当访问网站时,系统会首先查看hosts文件中是否有记录,如果记录存在则直接解析出对应的IP,这时则不需要请求DNS服务器。

6.4 网络测试工具

  • traceroute在IP包结构中有一个定义数据包生命周期的TTL(Time To Live)字段,该字段用于表明IP数据包的生命值,当IP数据包在网络上传输时,每经过一个路由器该值就减1,当该值减为0时此包就会被路由器丢弃。这种设计可用于避免出现一些由于某种原因始终无法到达目的地的包不断地在互联网上传递(可以形象地称之为“幽灵包”),减少无谓的网络资源耗用。

7.1 什么是进程

  • 所有的进程都可能存在3种状态:运行态、就绪态、阻塞态

7.2 进程和程序的区别

  • 进程和程序之间既有区别又有天然的联系。进程是动态的,而程序是静态的,进程是程序以及数据在计算机上的一次执行,没有静态的程序也就没有动态的执行。程序是可以以某种形式保存在存储介质上的,而进程只能在运行时存在于计算机的内存中。

7.3 进程的观察:ps、top

  • 命令ps输出的只是当前查询状态下进程瞬间的状态信息,如果要想及时动态地查看进程就需要使用top命令了。top命令提供了实时的系统状态监控,可以按照CPU使用、内存使用、执行时间等指标对进程进行排序。

7.5 查询进程打开的文件:lsof

  • lsof(list open files)是一个列出当前系统中所有打开文件的工具
  • 使用lsof命令还有个更实用的功能,就是可以通过其恢复被删除的文件—但这是有条件的,必须是文件正在被某个进程使用,而且该进程未停止(也就是依然拥有打开文件的句柄)。

7.6 进程优先级调整:nice、renice

  • 实际上,Linux使用了“动态优先级”的调度算法来确定每一个进程的优先级,一个进程的最终优先级=优先级+nice优先级。

第8章 Linux下的软件安装

  • 所谓解释型语言,就是计算机逐条取出源码文件的指令,将其转化成机器指令,并执行这个指令的过程。而编译型语言是指在程序运行前就将所有的源代码一次性转化为机器代码(一般为二进制程序),再运行这个程序的过程。
  • PATH变量中是一些由冒号隔开的路径,当输入一个命令时,系统会到PATH所定义的路径中去寻找该命令,找到后就会执行该命令
  • 典型的源码编译安装软件的过程包括以下3步:第一步,运行configure命令,并结合必要的参数以生成Makefile;第二步,运行make命令生成各类模块和主程序;第三步,运行make install命令将必要的文件复制到安装目录中。以上3步都需要在对应软件包目录的根目录下运行。
  • 在Linux系统中,一般在/usr/local/src/目录里下载源码包(这不是硬规定,而是一个良好的习惯)

8.2 RPM安装软件

  • RPM是RedHat Package Manager的简写,顾名思义是红帽软件包管理器的意思
  • 所谓包依赖,就是说在安装A包之前需要已经安装了B包,其实质是A软件运行时需要依赖B软件提供的功能。

8.3 yum安装软件

  • yum的全称为Yellow dog Updater,Modified,是一个基于RPM的shell前端包管理器,能够从指定的服务器上(一个或多个)自动下载并安装或更新软件、删除软件。其最大的好处是可以自动解决依赖关系。
  • yum默认在RedHat下是无法使用的

8.5 重建RPM包

  • 另一种方式是使用spec文件重建RPM包,其中spec文件是一个重建RPM包的配置文件,描述了RPM包的相关信息。

9.2 vi编辑器

  • vi编辑器有3种模式,分别是一般模式、编辑模式、末行指令模式
  • 查找关键字还可以使用“?”符号,和“/”不同的是,使用“?”查找默认是从光标位置向上寻找关键字,按n键代表继续往上寻找,按N键代表向下寻找

9.3 vim编辑器

  • vim支持多行编辑,而vi每次只能处理一行。
  • 在一般模式下按“%”可以查找配对的括号 )、]、 或},在程序调试时,使用这个功能用来查找不配对的括号是很有用的。

第10章 正则表达式

  • 正则表达式就是能用某种模式去匹配一类字符串的公式,它是由一串字符和元字符构成的字符串。所谓元字符,就是用以阐述字符表达式的内容、转换和描述各种操作信息的字符。
  • “*”符号用于匹配前一个字符0次或任意多次

10.2 正则表达式示例

  • grep的英文是Global search Regular Expression and print out the line,即全面搜索正则表达式并打印出匹配行
  • 由于正则表达式中含有较多特殊的字符,所以结合grep时,最好使用单引号将正则表达式括起来,以免造成错误。
  • 在方括号中使用“^”做反选

10.3 文本处理工具sed

  • sed(stream editor)是一种非交互式的流编辑器,通过多种转换修改流经它的文本。
  • 使用s命令可将查找到的匹配文本内容替换为新的文本。
  • 使用y命令可进行字符转换,其作用为将一系列字符逐个地变换为另外一系列字符
  • 使用i或a命令插入文本,其中i代表在匹配行之前插入,而a代表在匹配行之后插入
  • 使用p命令可进行打印,这里使用sed命令时一定要加-n参数,表示不打印没关系的行。
  • sed本身默认并不改写原文件,而只是对缓冲区的文本做了修改并输出到屏幕。所以想保存文件,除了之前提到的两种方法外(使用重定向或-i参数),还可以使用w命令将结果保存到外部指定文件。
  • 模式空间:当前输入行的缓冲区。存储空间:模式空间以外的一个预留缓冲区。

10.4 文本处理工具awk

  • sed其实是以行为单位的文本处理工具,而awk则是基于列的文本处理工具,它的工作方式是按行读取文本并视为一条记录,每条记录以字段分割成若干字段,然后输出各字段的值。
  • 每个非空白的部分叫做“域”,从左到右依次是第一个域、第二个域,等等。 $1、$2分别用于表示域,$0则表示全部域。
  • 默认情况下awk是使用空白字符作为分隔符的,但是也可以通过-F参数指定分隔符,来区分不同的域
  • 可以使用substr()函数对指定域截取字符串
  • 使用内部变量length可以确定字符串的长度

第11章 Shell编程概述

  • Shell是指一种命令行解释器,是为用户和操作系统之间通信提供的一种接口
  • 脚本语言又被称作解释型语言,这种语言经过编写后不需要做任何编译就可以运行。

11.2 第一个Shell脚本

  • 一个Shell脚本永远是以“#!”开头的,这是一个脚本开始的标记,它是在告诉系统执行这个文件需要使用某个解释器,后面的/bin/bash就是指明了解释器的具体位置。
  • 第二种方式是给该脚本加上可执行权限,然后使用“./”来运行,它代表运行的是当前目录下的HelloWorld.sh脚本,如果采用这种方式而脚本没有可执行权限则会报错。
  • 在排查错误时,使用echo命令有助于观察代码执行的情况
  • 为了更清晰地看到脚本运行的过程,还可以借助-x参数来观察脚本的运行情况。
  • 为了更精细地调试运行Shell,我们可以借助第三方工具bashdb。这是一个类似于GDB的脚本调试软件,小巧而强大,具有设置断点、单步执行、观察变量等功能。

11.3 Shell的内建命令

  • 所谓Shell内建命令,就是由Bash自身提供的命令,而不是文件系统中的某个可执行文件。
  • 内建命令会比外部命令执行得更快,执行外部命令时不但会触发磁盘I/O,还需要fork出一个单独的进程来执行,执行完成后再退出。而执行内建命令相当于调用当前Shell进程的一个函数。
  • 与点号类似,source命令也可读取并在当前环境中执行脚本,同时还可返回脚本中最后一个命令的返回状态;如果没有返回值则返回0,代表执行成功;如果未找到指定的脚本则返回false。
  • 任务前后台切换:bg、fg、jobs
  • echo用于打印字符,典型用法是使用echo命令并跟上使用双引号括起的内容(即需要打印的内容),该命令会打印出引号中的内容,并在最后默认加上换行符。使用-n参数可以不打印换行符。
  • 内建命令exec并不启动新的Shell,而是用要被执行的命令替换当前的Shell进程,并且将老进程的环境清理掉,而且exec命令后的其他命令将不再执行。
  • 在父Shell中创建变量时,这些变量并不会被其子Shell进程所知,也就是说变量默认情况下是“私有”的,或称“局部变量”。使用export命令可以将变量导出,使得该Shell的子Shell都可以使用该变量,这个过程称为变量输出。
  • Linux操作系统包括3种不同类型的进程,第一种是交互进程,这是由一个Shell启动的进程,既可以在前台运行,也可以在后台运行;第二种是批处理进程,与终端没有联系,是一个进程序列;第三种是监控进程,也称系统守护进程,它们往往在系统启动时启动,并保持在后台运行。

12.2 安装bash

  • Linux下安装软件的方式无非是RPM包安装、yum安装、源码安装3种方式

第13章 Shell编程基础

  • Shell变量是一种弱类型的变量,也就是说在声明变量时并不需要指定其变量类型,而且也不需要遵循C语言中“先声明再使用”的规定,任何时候只要想用就可以用。
  • 局部变量的作用域被限定在声明它们的Shell中,可以使用local内建命令来“显式”的声明局部变量,但仅限于函数内使用。
  • 环境变量通常又称“全局变量”,以区别于局部变量
  • Shell中的变量必须以字母或者下划线开头,后面可以跟数字、字母和下划线,变量长度没有限制。
  • 变量的取值也很简单,只需要在变量名前加上$符号既可,严谨一点的写法是${}
  • 取消变量指的是将变量从内存中释放,使用的命令是unset,后面跟变量名。
  • 脚本或命令返回值:$?
  • Linux中规定正常退出的命令和脚本应该以0作为其返回值,任何非0的返回值都表示命令未正确退出或未正常执行。
  • Shell中的数组对元素个数没有限制,但只支持一维数组
  • ${Array[@]}得到的是以空格隔开的元素值,而${Array[*]}的输出是一整个字符串
  • 在Linux系统中,不同进程ID的Shell默认为一个不同的命名空间。
  • 在函数体内使用local关键字声明了和全局变量同名的局部变量后,对该变量的操作只会影响局部变量,而不会影响与之同名的全局变量。
  • 在函数体内使用local关键字声明了和全局变量同名的局部变量后,对该变量的操作只会影响局部变量,而不会影响与之同名的全局变量。

13.2 转义和引用

  • Shell中有两类字符,一类是普通字符,在Shell中除了本身的字面意思外没有其他特殊意义,即普通纯文本(literal);另一类即元字符(meta),是Shell的保留字符,在Shell中有着特殊意义。
  • Shell中的转义符是反斜线“\”,使用转义符的目的是使转义符后面的字符单纯地作为字符出现,而不解释其特殊的含义
  • 引用是指将字符串用某种符号括起来,以防止特殊字符被解析为其他意思。
  • Shell中一共有4种引用符,分别是双引号、单引号、反引号(在键盘上和波浪号位于同一个键)和转义符。其中双引号又叫“部分引用”或“弱引用”,可以引用除$符、反引号、转义符之外的所有字符;单引号又叫“全引用”或“强引用”,可以引用所有字符;反引号则会将反引号括起的内容解释为系统命令。
  • 单引号和双引号在很多时候是一样的,只是要记住,在双引号中的$符、反引号、转义符还是会被解析成其特殊含义,而在单引号中所有的字符都只是字面意思。
  • Shell中有两种方式可以完成命令替换,一种是反引号(`),一种是$()

13.3 运算符

  • Shell中的运算符主要有比较运算符(用于整数比较)、字符串运算符(用于字符串测试)、文件操作运算符(用于文件测试)、逻辑运算符、算术运算符、位运算符、自增自减运算符等
  • Shell只支持整数计算,也就是所有可能产生小数的运算都会舍去小数部分。
  • 按位非(~)的计算方式比较麻烦,这里有个快捷的计算公式:“~a”的值为“-(a+1)”。
  • 前置自增或前置自减操作会首先修改变量的值,然后再将变量的值传递出去;后置自增或后置自减则会首先将变量的值传递出去,然后再修改变量的值。

13.4 其他算术运算

  • $[]和$(())类似,可用于简单的算术运算
  • expr命令也可用于整数运算。和其他算术运算方式不同,expr要求操作数和操作符之间使用空格隔开(否则只会打印出字符串),所以特殊的操作符要使用转义符转义(比如*)。
  • 默认情况下bc并不显示小数部分,必须设置要显示的小数位数。这可以通过设置scale做到

13.5 特殊字符

  • 单引号又叫称“全引用”或“强引用”;双引号又称“部分引用”或“弱引用”
  • $0:脚本名本身。$1、$2……${10}:脚本的第一个参数、第二个参数……第十个参数。$#:变量总数。$*、$@:显示所有参数。$?:前一个命令的退出的返回值。$!:最后一个后台进程的ID号。

第14章 测试和判断

  • 要判断文件/var/log/message文件是否存在,可以先ls该文件,然后用$?来判断
  • 表14-1 文件测试符

14.2 判断

  • if expression; then
 command
else
 command
fi

第15章 循环

  • Shell中的循环主要有for、while、until、select几种。

15.1 for循环

  • Shell提供了用于计数的方式,比如说上例中1到5可以用{1..5}表示。
  • 还可以使用seq命令结合命令替换的方式生成列表,下面的例子可以针对1到100的求和进行计算,其中的命令替换部分还可以使用$()代替。
  • 使用不带列表的for循环时,需要在运行脚本时通过参数的方式给for循环传递变量值。
  • for ((expression1; expression2; expression3))
do
 command
done

15.2 while循环

  • 使用重定向符的while只会产生一个Shell,而使用管道的脚本在运行时会产生3个Shell,第一个Shell是cat(由于运行速度很快所以无法使用ps命令抓到),第二个Shell是管道,第三个Shell是while。

15.3 until循环

  • until循环也是运行前测试,但是until采用的是测试假值的方式,当测试结果为假时才继续执行循环体,直到测试为真时才停止循环

第16章 函数

  • 函数的返回值又叫函数的退出状态,实际上是一种通信方式

16.3 函数库

  • 库函数的本质也是“函数”,所以它的定义方式和普通函数没有任何区别,但为了和一般函数区分开来,在实践中建议库函数使用下划线开头。
  • 很多Linux发行版中都有/etc/init.d目录,这是系统中放置所有开机启动脚本的目录,这些开机脚本在脚本开始运行时都会加载/etc/init.d/functions或/etc/rc.d/init.d/functions函数库(实际上这两个函数库的内容是完全一样的)

16.4 递归函数

  • 递归函数的典型特征为:在函数体中继续调用函数自身。

第17章 重定向

  • 所谓“重定向”,就是将原本应该从标准输入设备(键盘)输入的数据,改由其他文件或设备输入;或将原本应该输出到标准输出设备(显示器)的内容,改而输出到其他文件或设备上。
  • 系统在启动一个进程的同时会为该进程打开三个文件:标准输入(stdin)、标准输出(stdout)、标准错误输出(stderr),分别用文件标识符0、1、2来标识

17.2 I/O重定向

  • 表17-1 常见的I/O重定向符号

第18章 脚本范例

  • 而for循环在读取文件时,任何空白字符都可以作为其读取的分隔符

18.3 使用expect实现自动化输入

  • expect是一种能够按照脚本内容设定的方式和交互程序进行“对话”的程序。

18.6 ssh自动登录备份

  • 第二步,使用ssh-copy-id复制公钥到远程主机。

18.10 自定义开机启动项的init脚本

  • 但是和一般的shell脚本不同,init脚本需要满足一定的格式,最基本的要求是,脚本必须接收至少两个参数:start和stop,分别用于启动和停止服务。