第三部分 shell基本功能

Bash 是’Bourne-Again SHell’的缩写。Bourne shell 是传统的 Unix shell,最初由 Stephen Bourne 编写。所有 Bourne shell 内置命令都可以在 Bash 中使用,但是求值和引用的规则取自“标准”Unix shell 的 POSIX 规范。

本章简要总结了 shell 的结构组成:命令、控制结构、shell 函数、shell参数, shell扩展,重定向(重定向是一种从命名文件直接输入和输出的方法),以及 shell 如何执行命令。

Shell Syntax (shell 语法)

当 shell 读取输入时,它会执行一系列操作。如果输入指示注释的开始,则 shell 会忽略注释符号 (‘#’),以及该行的其余部分。

否则,粗略地说,shell 读取其输入并将输入划分为单词和运算符,使用引用规则来选择为各种单词和字符分配哪些含义。

然后 shell 将这些标记解析为命令和其他结构,删除某些单词或字符的特殊含义,扩展其他单词或字符,根据需要重定向输入和输出,执行指定的命令,等待命令的退出状态,并使退出状态可用以便进一步检查或处理。

Shell Operation(shell 操作


下面简单描述一下shell读取并执行命令时的操作。基本上,shell 执行以下操作:

1、shell接收输入的方式有三种:一是从文件中读取其输入(请参阅 Shell Scripts ),二是从作为参数提供给-c调用选项(请参阅 Invoking Bash ),三是从用户终端接收用户的的输入。
2、将输入分解为单词和运算符,遵循引用(Quoting) 中描述的引用规则。这些标记由 元字符(metacharacters分隔。别名扩展是通过此步骤执行的(参见 Aliases )。
3、将标记解析为简单命令和复合命令(请参阅 Shell Commands )。
4、执行各种 shell 扩展(请参阅 Shell Expansions ),将扩展标记分解为文件名列表(请参阅 Filename Expansion )以及命令和参数。
5、执行任何必要的重定向(请参阅 Redirections )并从参数列表中删除重定向运算符及其操作数。
6、执行命令(请参阅 Executing Commands )。
7、(可选)等待命令完成并收集其退出状态(请参阅 Exit Status )。

Quoting(引用)

引用用于删除某些字符或单词对 shell 的特殊含义。引号可用于禁用对特殊字符的特殊处理,以防止保留字被识别为保留字,或者禁止参数扩展。

每个 shell 元字符(请参阅 Definitions )对于 shell 都具有特殊含义,如果要代表其自身,则必须用引号引起来。当使用命令历史扩展功能时(参见 History Expansion ),历史扩展字符,通常是 ‘!’,必须被引用以防止历史扩展。有关历史扩展的更多详细信息,请参阅 Bash History Facilities 。

共有三种引用机制:转义字符、单引号和双引号。

Escape Character(转义)

不带引号的反斜杠 ‘’ 是 Bash 转义字符。它保留后面的下一个字符的字面值,但 newline 除外。如果出现 \newline ,并且反斜杠本身未加引号,则 \newline 将被视为行延续(即,它会从输入流中删除并被完全忽略)。
Single Quotes(单引号引用)
将字符括在单引号中 (‘’’) 保留引号内每个字符的字面值。单引号之间不能出现单引号,即使前面有反斜杠也是如此。

Double Quotes (双引号引用)

将字符括在双引号中 (‘”’) 保留引号内所有字符的字面值,但是有几个字符除外: ‘ ’(美元符号) , ‘ ‘ ’(反引号) , ‘ (ˊ反斜杠)及启用历史扩展 的′!′(感叹号)。当 s h e l l 处于 P O S I X 模式时(请参阅 B a s h P O S I X M o d e ) ,′!′在双引号内没有特殊含义,即使启用了历史扩展也是如此。在双引号内 ,′ ’(美元符号), ‘`’(反引号), ‘\’(反斜杠)及启用历史扩展的’!’(感叹号)。当 shell 处于 POSIX 模式时(请参阅 Bash POSIX Mode ), ‘!’ 在双引号内没有特殊含义,即使启用了历史扩展也是如此。在双引号内, ‘(美元符号),‘‘’(反引号),ˊ反斜杠)及启用历史扩展!(感叹号)。当shell处于POSIX模式时(请参阅BashPOSIXMode!在双引号内没有特殊含义,即使启用了历史扩展也是如此。在双引号内’ (美元符号)和 ‘' (反引号)保留其特殊含义(请参阅 Shell Expansions );反斜杠仅在其后字符为:'$’, ‘’, ‘”’, ‘’,或 newline,反斜杠才保留其特殊含义。在双引号内,后跟这些字符之一的反斜杠在shell解释后将被删除,反斜杠后面是没有特殊含义字符,反斜杠将保留。双引号可以在双引号内引用,方法是在双引号前面加上反斜杠。如果启用了历史扩展,’! ‘会执行历史扩展,除非 ‘! ‘出现在双引号中或者使用反斜杠进行转义。’!’ 前面的反斜杠不会被删除。

特殊参数’*’ 和 ‘@’ 在双引号中具有特殊含义(请参阅 Shell Parameter Expansion )。

ANSI-C Quoting (ANSI-C引用)

$’ string ’ 形式的字符序列被视为一种特殊类型的单引号。该序列扩展为 string ,并按照 ANSI C 标准的指定替换 string 中的反斜杠转义字符。反斜杠转义序列(如果存在)按如下方式解码:

\a alert (bell) 响铃

\b backspace 退格

\e、\E 转义字符(非 ANSI C)

\f form feed 走纸换页

\n newline 换行

\r carriage return 回车

\t horizontal tab 水平制表

\v vertical tab 垂直制表

\ backslash 反斜杠

’ single quote 单引号

” double quote 双引号

? question mark 问号

\nnn 值为八进制值 nnn 的八位字符(一到三个八进制数字)

\xHH 八位字符,其值为十六进制值 HH (一位或两位十六进制数字)

\uHHHH Unicode (ISO/IEC 10646) 字符,其值为十六进制值 HHHH (一到四个十六进制数字)

\UHHHHHHHH Unicode (ISO/IEC 10646) 字符,其值为十六进制值 HHHHHHHH (一到八个十六进制数字)

\cx 一个控制- x 字符

扩展结果是单引号的,就好像美元符号不存在一样。

Locale-Specific Translation (特定于语言环境的解释)

在双引号字符串前加上美元符号 (‘$’),例如 $“hello, world” ,将导致字符串根据当前语言区域设置进行翻译。 gettext 基本设定是使用 LC_MESSAGES 、 TEXTDOMAINDIR 和 TEXTDOMAIN shell 变量执行查找和转换。如果当前区域设置是 C 或 POSIX ,没有可用的翻译或者字符串未翻译,则忽略美元符号。由于这是双引号的一种形式,因此默认情况下,无论是否翻译和替换,字符串都保持双引号。如果使用 shopt 内置功能启用 noexpand_translation 选项(请参阅 The Shopt Builtin ),则翻译后的字符串将使用单引号而不是双引号。有关此处的详细信息,请参阅 gettext 文档。

本节简要概述了如何使用 gettext 在名为 scriptname 的 shell 脚本中创建字符串翻译。gettext 文档中有更多详细信息。