bash手册翻译#3.1 shell语法

来源:互联网 发布:虚拟社交网络的优点 编辑:程序博客网 时间:2024/06/02 02:13

Bash是 Bourne-Again SHell 的首字母缩写。Bourne shell是传统的Unix系统shell,最初为Stephen Bourne编写。所有Bourne shell内建的命令都可以在bash中使用。而赋值以及引用相关的规则来源于专门为标准Unix shell制定的POSIX规范。

这一章将概要归纳shell的构成区块:命令,控制结构,函数,参数,shell扩展,用于指向输入和输出文件的重定向机制,以及shell何如执行命令。

  • Shell语法:你的输入的含义。
  • Shell命令:你允许使用的命令种类。
  • Shell函数:对一组命令进行命名。
  • Shell参数:shell如何存储数值。
  • Shell扩展:Bash如何扩展参数以及可用的扩展。
  • 重定向:一种从哪输入以及往哪输出的控制方法。
  • 执行命令:执行一条命令时到底发生了什么。
  • Shell脚本:执行包含shell命令的文件。

3.1 Shell 语法

  • Shell 操作:shell中基本的操作。
  • 引用:如何去除字符的特殊含义。
  • 注释:如何标记注释。
    当shell读取输入,它会按顺序执行命令。如果输入指示注释,shell就会忽略注释符号(‘#’),以及该行后续的内容。

否则,粗略地说,shell将会读取输入,并将输入分为字和操作符。运用引用规则将各种字和字符选择对应的含义。

shell然后把这些记号解析为命令和其他结构,移除某些字和字符的特殊含义,并扩展其他标记,在需要的情况下重定向输入和输出,执行指定的命令,并等待命令的退出码,并将这些值用于后续的检测和处理。


3.1.1 Shell 操作

下面的步骤简要地描述当shell读取和执行一条命令时,shell对应的操作。基本说来,shell会做如下的操作:
1. 从一个文件中读取输入。file通常作为-c调用选项的参数(参见 Invoking Bash),或者从用户的终端读取。
2. 在Quoting中描述的规则下,把输入分断为字和操作符。这些记好被元字符隔断开。别名这一扩展就是在这一步进行的。
3. 把这些记好解析为简单或者复合命令 。
4. 执行shell的各种扩展功能,将扩展标记分断为文件名列表,以及命令和参数。
5. 执行必要的重定向以及将重定向操作符以及他们的操作数从参数列表中移除。
6. 执行指令
7. 选择性地等待命令完成并收集命令的退出码。


3.1.2 引用

  • Escape Character:如何去除单个字符的特殊含义。
  • 单引用:如何禁止对一个字符序列所有解析。
  • 双引用:如何抑制对一个字符序列的大部分解析。
  • ANSI-C:如何在一个引用的字串中扩展ANSI-C序列。
  • 本地翻译:如何将一个字串翻译为不同的语言。

引用用于将一个字串或者字符的特殊含义去除。引用也可以用于关闭对特殊字符的特殊处理,以避免保留字被正常标记,以及避免被当作参数扩展。

每一种元字符对shell来说都有特殊含义,如果想表示字符本身时,元字符必须被引用。当使用history命令时,命令扩展字符,通常为’!’,必须被引用来避免history扩展。更多细节请参见history expansion。

一共有三种引用机制, 转义字符, 单引用, 以及双引用。


3.1.2.1 转义字符

未被引用的反斜杠’\’就是bash中的转义字符。它将紧接着的除换行符(newline)之外的字符保留其原本含义。如果\newline成对出现,并且这个反斜杠没有被引用,\newline将被当作续行符(也就是说,换行符将从输入流中移除并忽略掉)。

3.1.2.2 单引用

被单引号围起来的字符将被保留其字面的含义。单引号不应该在多个单引号之间出现,就算被转义符转义也不行。


3.1.2.3 双引用

被双引号包含的字符将保留其字面含义,除了一下三个字符:

$ ` \

以及当历时扩展功能开启(history expansion)时的!$和反引号在双引号中有特殊含义(参见Shell Expansions)。而反斜杠在后门跟着如下字符的时候,将保留它的特殊含义:

$ ` " \ newline

当双引号中的当反斜杠后面跟着如上字符时,反斜杠将被移除,反斜杠将转义如上字符的特殊含义。(译者:其实双赢号语法里特殊的字符就是四个,而反斜杠将这四个,包括它自己的进行转义,语法上就能在引号中显示任何字符)。* 和@ 在双引用中也有特殊的含义(Shell Parameter Expansion)。


3.1.2.4 ANSI-C引用

$'string'这种形式表示的标记将被特殊处理,标记将被扩展成string,而且string里被转义的字符将是为ANSI C中的转义字符。如下字符将被解码:
\a,\b,\e,\E,\f,\n,\r,\t,\v,\,\’,\”,\nnn,\xHH,\uHHH,\UHHHHHHHH,\cx。扩展的结果是单引号包含的字串,就像$不存在一样。
(续)

0 0
原创粉丝点击