禅道博客

分享专业技术知识,文章内容干货满满

《Linux命令行与shell脚本编程大全》第十一章

2023-12-21 15:06:44
王肖蒙
原创 1062
摘要:本文是《Linux命令行与shell脚本编程大全》第11章的读书笔记。

11.1 使用多个命令

如果要两个命令一起运行,可以把它们放在同一行中,彼此间用分号隔开。

date命令先运行,显示了当前日期和时间,后面紧跟着who命令的输出,显示当前是谁登录到了系统上。

11.2 创建shell脚本文件

在创建shell脚本文件时,必须在文件的第一行指定要使用的shell。其格式为:

#!/bin/bash

在通常的shell脚本中,井号(#)用作注释行。shell并不会处理shell脚本中的注释行。然而,shell脚本文件的第一行是个例外,#后面的惊叹号会告诉shell用哪个shell来运行脚本。

在指定了shell之后,就可以在文件的每一行中输入命令,然后加一个回车符。

可以根据需要,使用分号将两个命令放在一行上,但在shell脚本中,你可以在独立的行中书写命令。shell会按根据命令在文件中出现的顺序进行处理。

让shell找到test1脚本,只需采取以下两种作法之一:
  1. 将shell脚本文件所处的目录添加到PATH环境变量中;
  2. 在提示符中用绝对或相对文件路径来引用shell脚本文件。
窍门 有些Linux发行版将$HOME/bin目录添加进了PATH环境变量。它在每个用户的HOME目录下提供了一个存放文件的地方,shell可以在那里查找要执行的命令。

11.3 显示消息

想要添加自己的文本消息来告诉脚本用户脚本正在做什么。可以通过echo命令来实现。

默认情况下,不需要使用引号将要显示的文本字符串划定出来。但有时在字符串中出现引号的话就比较麻烦了。

echo命令可用单引号或双引号来划定文本字符串。如果在字符串中用到了它们,你需要在文本中使用其中一种引号,而用另外一种来将字符串划定起来。

把文本字符串和命令输出显示在同一行中,可以用echo语句的-n参数。

echo命令是shell脚本中与用户交互的重要工具。

11.4 使用变量

11.4.1 环境变量

shell维护着一组环境变量,用来记录特定的系统信息。比如系统的名称、登录到系统上的用户名、用户的系统ID(也称为UID)、用户的默认主目录以及shell查找程序的搜索路径。可以用set命令来显示一份完整的当前环境变量列表。

在脚本中,你可以在环境变量名称之前加上美元符($)来使用这些环境变量。

$USER、$UID和$HOME环境变量用来显示已登录用户的有关信息。

echo命令中的环境变量会在脚本运行时替换成当前值。

说明:你可能还见过通过${variable}形式引用的变量。变量名两侧额外的花括号通常用来帮助识别美元符后的变量名。

11.4.2 用户变量

shell脚本允许在脚本中定义和使用自己的变量。

用户变量可以是任何由字母、数字或下划线组成的文本字符串,长度不超过20个。用户变量区分大小写,所以变量Var1和变量var1是不同的。

使用等号将值赋给用户变量。在变量、等号和值之间不能出现空格。

shell脚本会自动决定变量值的数据类型。

用户变量可通过美元符引用。

引用一个变量值时需要使用美元符,而引用变量来对其进行赋值时则不要使用美元符。

11.4.3 命令替换

shell脚本中最有用的特性之一就是可以从命令输出中提取信息,并将其赋给变量。

有两种方法可以将命令输出赋给变量:
  1. 反引号字符(`)
  2. $()格式
警告 命令替换会创建一个子shell来运行对应的命令。子shell(subshell)是由运行该脚本的shell所创建出来的一个独立的子shell(child shell)。正因如此,由该子shell所执行命令是无法使用脚本中所创建的变量的。

在命令行提示符下使用路径./运行命令的话,也会创建出子shell;要是运行命令的时候不加入路径,就不会创建子shell。如果你使用的是内建的shell命令,并不会涉及子shell。在命令行提示符下运行脚本时一定要留心!

11.5 重定向输入和输出

11.5.1 输出重定向

将命令的输出发送到一个文件中。bash shell用大于号(>)来完成这项功能:

command > outputfile

11.5.2 输出重定向

输入重定向符号是小于号(<):

command < inputfile

简单的记忆方法:在命令行上,命令总是在左侧,而重定向符号“指向”数据流动的方向。小于号说明数据正在从输入文件流向命令。

wc命令可以对对数据中的文本进行计数。
  1. 文本的行数
  2. 文本的词数
  3. 文本的字节数
内联输入重定向:无需使用文件进行重定向,只需要在命令行中指定用于输入重定向的数据就可以。

内联输入重定向符号是远小于号(<<)。

11.6 管道

将一个命令的输出作为另一个命令的输入。

rpm命令通过Red Hat包管理系统(RPM)对系统(比如上例中的Fedora系统)上安装的软件包进行管理。配合-qa选项使用时,它会生成已安装包的列表,但这个列表并不会遵循某种特定的顺序。

我们用不着将命令输出重定向到文件中,可以将其直接重定向到另一个命令。这个过程叫作管道连接(piping)。

和命令替换所用的反引号(`)一样,管道符号在shell编程之外也很少用到。该符号由两个竖线构成,一个在另一个上面。然而管道符号的印刷体通常看起来更像是单个竖线(|)。在美式键盘上,它通常和反斜线(\)位于同一个键。

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

command1 | command2

管道命令运行:在第一个命令产生输出的同时,输出会被立即送给第二个命令。

11.7 执行数学运算

11.7.1 expr命令

expr命令允许在命令行上处理数学表达式,但是特别笨拙。
操作符
描述
ARG1 | ARG2
如果ARG1既不是null也不是零值,返回ARG1;否则返回ARG2
ARG1 & ARG2
如果没有参数是null或零值,返回ARG1;否则返回0
ARG1 < ARG2
如果ARG1小于ARG2,返回1;否则返回0
ARG1 <= ARG2
如果ARG1小于或等于ARG2,返回1;否则返回0
ARG1 = ARG2
如果ARG1等于ARG2,返回1;否则返回0
ARG1 != ARG2
如果ARG1不等于ARG2,返回1;否则返回0
ARG1 >= ARG2
如果ARG1大于或等于ARG2,返回1;否则返回0
ARG1 > ARG2
如果ARG1大于ARG2,返回1;否则返回0
ARG1 + ARG2
返回ARG1和ARG2的算术运算和
ARG1 - ARG2
返回ARG1和ARG2的算术运算差
ARG1 * ARG2
返回ARG1和ARG2的算术乘积
ARG1 / ARG2
返回ARG1被ARG2除的算术商
ARG1 % ARG2
返回ARG1被ARG2除的算术余数
STRING : REGEXP
如果REGEXP匹配到了STRING中的某个模式,返回该模式匹配
match STRING REGEXP
如果REGEXP匹配到了STRING中的某个模式,返回该模式匹配
substr STRING POS LENGTH
返回起始位置为POS(从1开始计数)、长度为LENGTH个字符的子字符串
index STRING CHARS
返回在STRING中找到CHARS字符串的位置;否则,返回0
length STRING
返回字符串STRING的数值长度
+ TOKEN
将TOKEN解释成字符串,即使是个关键字
(EXPRESSION)
返回EXPRESSION的值

11.7.2 使用方括号

在bash中,在将一个数学运算结果赋给某个变量时,可以用美元符和方括号($[ operation ])将数学表达式围起来。

在使用方括号来计算公式时,不用担心shell会误解乘号或其他符号。

11.7.3 浮点解决方案

bc的基本用法

bash计算器能够识别:

1. 数字(整数和浮点数)

2. 变量(简单变量和数组)

3. 注释(以#或C语言中的/* */开始的行)

4. 表达式

5. 编程语句(例如if-then语句)

6. 函数

在脚本中使用bc

用命令替换运行bc命令。

variable=$(echo "options; expression" | bc)

第一部分options允许你设置变量。如果你需要不止一个变量,可以用分号将其分开。expression参数定义了通过bc执行的数学表达式。

11.8 退出脚本

shell中运行的每个命令都使用退出状态码(exit status)告诉shell它已经运行完毕。退出状态码是一个0~255的整数值。

11.8.1 查看退出状态码

$?来保存上个已执行命令的退出状态码。

一个成功结束的命令的退出状态码是0。
状态码
描述
0
命令成功结束
1
一般性未知错误
2
不适合的shell命令
126
命令不可执行
127
没找到命令
128
无效的退出参数
128+x
与Linux信号x相关的严重错误
130
通过Ctrl+C终止的命令
225
正常范围之外的退出状态码

11.8.2 exit命令

exit命令允许你在脚本结束时指定一个退出状态码。

当查看脚本的退出码时,你会得到作为参数传给exit命令的值。

也可以在exit命令的参数中使用变量。
暂时没有记录
评论通过审核后显示。