Linux培训
达内IT学院

400-111-8989

bash shell 的一些主要特性


bash shell 是可用于 Linux 的几个 shell 之一,也被称为 Bourne-again shell,是根据一个早期的 shell (/bin/sh) 的创建者 Stephen Bourne 来命名的。Bash 高度兼容 sh,但它在函数和编程功能上都提供了许多改进。它合并了来自 Korn shell (ksh) 和 C shell (csh) 的特性,想要成为一个符合 POSIX 的 shell。

在深入了解 bash 之前,回想一下 shell是一个接受和执行命令的程序。它还支持编程结构,允许使用更小的部件构建复杂的命令。这些复杂命令或 脚本可保存为文件,独自成为新命令。实际上,典型 Linux 系统上的许多命令 都是脚本。

Shell 有一些 内置命令,比如 cd、break和 exec。其他命令是 外部命令。

Shell 也使用 3 种标准 I/O 流:

stdin是 标准输入流,它向命令提供输入。

stdout是 标准输出流,它显示来自命令的输出。

stderr是 标准错误流,它显示来自命令的错误输出。

输入流向程序提供输入,这些输入通常来自终端击键。输出流打印文本字符,通常打印到终端。终端最初为 ASCII 打字机或显示终端,但现在通常是图形桌面上的窗口。有关如何重定向这些标准 I/O 流的更多细节,将会在本 系列的另一篇教程中介绍。

命令和序列

shell 的主要功能是解释您的命令,以便您可以与 Linux 系统交互。在 Linux(和 UNIX®)系统上,命令有一个 命令名,然后拥有 选项和 参数。一些命令既没有选项也没有参数,一些命令只有其中一种。

如果某一代码行包含一个 # 字符,那么该行上的所有剩余字符都会被忽略。所以 # 字符既可以表示注释,也可以表示根用户提示符。从上下文可以明显看出它应表示什么。

Echo

echo命令将其参数打印(或回送)到终端,如下所示。

Echo 示例

[root@opsexm ~]$ echo Word

Word

[root@opsexm ~]$ echo A phrase

A phrase

[root@opsexm ~]$ echo Where are my spaces?

Where are my spaces?

[root@opsexm ~]$ echo "Here are my spaces." # plus comment

Here are my spaces.

在 上面的第 3 个示例中,所有额外的空格在输出中都被压缩为单个空格。为避免这种情况,需要使用双引号 (") 或单引号 (') 给字符串 加上引号。Bash 使用 空白(比如空格、制表符和换行符)将输入行分割为 记号 (token),然后传递给命令。给字符串加上引号会保留额外的空白,使整个字符串成为一个记号。在上面的示例中,命令名后的每个记号都是一个参数,所以我们分别有 1、2、4 和 1 个参数。

echo 命令有两个选项。通常,echo 会在输出的末尾处附加一个换行符。可使用 -n选项禁止此行为。可使用 -e选项让某些经过反斜杠转义的字符具有特殊的含义。一些字符如 下列表中所示。

Echo 和转义字符

转义字符序列 功能

\a 警报(闹钟)

\b 退格

\c 禁止结尾的换行符(等效于 -n 选项)

\f 换页(清除视频显示器上的屏幕)

\n 换行

\r 回车

\t 水平制表符

转义和续行

在 bash 中使用反斜杠有一个小问题。当为给反斜杠字符 (\) 加上引号时,它可以充当一个转义字符来告诉 bash 本身保留后面的字符的字面含义。这对特殊的 shell 元字符很有必要,我们稍后会介绍元字符。此规则有一个例外:反斜杠后跟一个换行符会导致 bash 合并两个字符,将该序列视为一个续行请求。这样可以很方便地分割较长的行,尤其是在 shell 脚本中。

要让 echo命令或其他许多使用类似转义控制字符的命令正确处理上述序列,必须将转义序列放在引号中,或者作为引号中的字符串的一部分,除非您使用了第二个反斜杠让 shell 将其中一个保留给命令。下面例子给出了 \ 的各种用法的一些示例。

更多 echo 示例

[root@opsexm ~]$ echo -e "No new line\c"

No new line[root@opsexm ~]$ echo "A line with a typed

> return"

A line with a typed

return

[root@opsexm ~]$ echo -e "A line with an escaped\nreturn"

A line with an escaped

return

[root@opsexm ~]$ echo "A line with an escaped\nreturn but no -e option"

A line with an escaped\nreturn but no -e option

[root@opsexm ~]$ echo -e Doubly escaped\\n\\tmetacharacters

Doubly escaped

metacharacters

[root@opsexm ~]$ echo Backslash \

> followed by newline \

> serves as line continuation.

Backslash followed by newline serves as line continuation.

请注意,当您键入的一行中包含不匹配的引号时,bash 会显示一个特殊提示符 (>)。您的输入字符串会延续到第二行,并包含换行符。

Bash shell 元字符和控制运算符。

Bash 有多个 元字符,在未加引号时,它们的作用是将输入分解为单词。除了空格之外,元字符还包括:

|

&

;

(

)

<

>

我们将在本教程的其他部分更详细讨论其中一些元字符。但现在需要注意的是,如果想要包含元字符作为文本的一部分,则必须将它放在引号中或使用反斜杠 (\) 转义,如 下方例子中所示。

换行符和某些元字符或元字符对也可以用作 控制运算符。它们是:

||

&&

&

;

;;

|

(

)

这些控制运算符中的部分运算符可用于创建命令 序列或 列表。

最简单的命令序列是由一个分号 (;) 分开的两个命令。每个命令按顺序执行。在任何可编程环境中,命令都会返回成功或失败指示;Linux 命令通常返回 0 值表示成功,在失败时返回非 0 值。可以使用 && 和 || 控制运算符向列表中引入一些条件处理。如果使用控制运算符 && 将两个命令分开,当且仅当第一个命令返回退出值 0 时,才会执行第二个命令。如果使用 || 分离这些命令,那么只在第一个命令返回非 0 的退出代码时,才会执行第二个命令。清单 5给出了一些使用 echo 命令的命令序列。这些命令序列不是很有趣,因为 scho 返回了 0,但是在后面有更多命令可用时,您会看到更多例子。

命令序列

[root@opsexm ~]$ echo line 1;echo line 2; echo line 3

line 1

line 2

line 3

[root@opsexm ~]$ echo line 1&&echo line 2&&echo line 3

line 1

line 2

line 3

[root@opsexm ~]$ echo line 1||echo line 2; echo line 3

line 1

line 3

Exit

可以使用 exit命令终止 shell。可以提供一个退出代码作为参数,此操作是可选的。如果在图形桌面上的终端窗口中运行 shell,您的窗口将会关闭。类似地,如果使用 ssh 或 telnet(举例而言)连接到远程系统,您的连接将终止。在 bash shell 中,还可以按住 Ctrl键并按下 d键来退出。

让我们看看另一个控制运算符。如果将一个命令或命令列表放在括号中,该命令或序列会在一个子 shell 中执行,所以 exit 命令会退出子 shell,而不是退出您所在的 shell。下方例子给出了一个结合使用 &&、|| 和两个不同的退出代码的示例。

子 shell 和序列

[root@opsexm ~]$ (echo In subshell; exit 0) && echo OK || echo Bad exit

In subshell

OK

[root@opsexm ~]$ (echo In subshell; exit 4) && echo OK || echo Bad exit

In subshell

Bad exit

预约申请免费试听课

填写下面表单即可预约申请免费试听! 怕学不会?助教全程陪读,随时解惑!担心就业?一地学习,可全国推荐就业!

上一篇:在Linux中设置sudo的十条sudoers实用配置
下一篇:没有下一篇了

如何在 Shell 脚本中跟踪调试命令的执行

  • 扫码领取资料

    回复关键字:视频资料

    免费领取 达内课程视频学习资料

Copyright © 2023 Tedu.cn All Rights Reserved 京ICP备08000853号-56 京公网安备 11010802029508号 达内时代科技集团有限公司 版权所有

选择城市和中心
黑龙江省

吉林省

河北省

湖南省

贵州省

云南省

广西省

海南省