GNU Bash 手册 (2)

3 Shell的基本特性
*****************
                                                                                                                                              
    Bash的全称是'Bourne-Again SHell'. Bourne shell是Stephen Bourne写的
用于传统Unix的shell. Bourne shell中所有的内部命令在Bash中都支持, Bash
的求值和引用则取自于POSIX中关于'标准'Unix shell的规定.
                                                                                                                                              
    本章大概介绍Bash的'构建块': 命令, 控制结构, shell函数, shell参数,
shell扩展, 重定向(将输入导入进文件和将文件导出到输出的方法), 以及shell
是如何执行命令的.
                                                                                                                                              
3.1 Shell的语法
===============
                                                                                                                                              
    当Bash读输入时, 它会对输入进行一系列操作. 如果输入以注释符开头, Bash
将忽略注释符以及该行其后的内容.
                                                                                                                                              
    否则, 粗略地讲, Bash读入输入并将输入分割成一个个单词和操作符, 然后
运用引用规则对不同的单词和操作符赋以不同的意义.
                                                                                                                                              
    紧接其后, Bash将这些token解析为命令和其他构造, 去除某些单词和字符的
特殊意义, 扩展某些单词, 如果需要则重定向输入或输出, 执行该命令, 等待该命令
退出, 最后将退出状态交给后续的处理过程.
                                                                                                                                              
3.1.1 Shell的操作
-----------------
                                                                                                                                             
    以下是shell读取并执行一个命令的流程的简要描述. 基本上, shell会做以下
几件事情:
  1. 从一个文件(*参见 Shell脚本::), 或作为调用选项'-c'变元的一个字符串,
     或用户终中读取输入.
                                                                                                                                             
  2. 依据引用规则(*参见 引用::), 将输入分割成单词和操作符. 注意这些token
     被元字符分隔. 别名扩展也在这步中进行.
                                                                                                                                             
  3. 将这些token解析为简单或复合命令(*参见 Shell命令::).
                                                                                                                                             
  4. 进行各种shell扩展(*参见 Shell扩展::), 使扩展后的token变成文件名列表
     (*参见 文件名扩展::), 命令和变元.
                                                                                                                                             
  5. 进行各种必要的重定向(*参见 重定向::), 然后从变元列表中移去重定向操作
     符和他们的操作数.
                                                                                                                                             
  6. 执行该命令(*参见 命令的执行::).
                                                                                                                                             
  7. 可选地等待该命令执行结束并收集其退出状态(*参见 退出状态::).
                                                                                                                                             
3.1.2 引用
----------
                                                                                                                                             
    引用的作用是去除某些字符和单词相对于shell的特殊涵义. 引用可以阻止
shell对特殊字符及保留字的特殊对待, 并阻止对参数的扩展.
                                                                                                                                             
    Shell的每个元字符(*参见 定义::)对shell来说都具有特殊的意义, 要使用
它们自身所表示的字符的话, 必须对它们加以引用. 例如当shell的命令历史记录
扩展功能(*参见 历史记录交互::)被打开时, 要使用'历史扩展'字符(一般为'!'),
必须将其加以引用. 欲了解历史记录扩展的细节, *参见 Bash历史记录功能::.
                                                                                                                                             
    Bash有三种扩展机制: 转义字符, 单引用和双引用.
                                                                                                                                             
3.1.2.1 转义字符
..................
                                                                                                                                             
    Bash的转义字符是一个未被引用的反斜杠符号'/'. 它保留了跟在其后的一个
字符的字面值. 注意'newline'符号是一个例外, 如果'/newline'以配对形式出现,
并且此反斜杠没有被引用, 那么'/newline'被作为行连接符(就是说, 该对被从
输出中去除, 效果上看就像被忽略了).
                                                                                                                                             
3.1.2.2 单引用
..............
                                                                                                                                             
    用两个单引号(')把一些字符括起来将保留(或说取消)引号之内任一字符的
字面值. 单引号不能出现在单引号之间, 即使前面加转义符也不行.
                                                                                                                                             
3.1.2.3 双引用
..............
                                                                                                                                             
    用两个双引号(')把一些字符括起来将保留(或说取消)引号之内任一字符的
字面值, 除了'$', ''', '/'和'!'(如果历史记录扩展被启用). 双引号内的'$'
和'''符号仍然拥有其相对于shell的特殊意义(*参见 Shell扩展::), 双引号内
的反斜杠在后面跟着'$', ''', '"', '/', 'newline'字符的时候仍然拥有特殊
意义, 此时该反斜杠被去除. 双引号内的反斜杠在后面跟着没有特殊意义的字符
时, 该反斜杠被留着不作任何修改. 双引号可被置于双引号之内, 只要前面加一
个反斜杠. 在双引号内没有被反斜杠转义的'!'符将被历史记录扩展, 如果历史
记录功能被启用的话. 在!前的反斜杠不会被移除.
                                                                                                                                             
    双引号内的'*'和'@'符有特殊含义(*参见 Shell参数扩展::).
                                                                                                                                             
3.1.2.4 ANSI-C引用
..................
                                                                                                                                             
    Shell对待形如$'STRING'的单词比较特殊, 该单词扩展成STRING, 并且其
内的反斜杠转义的字符将根据ANSI C标准被替换. 如果有的话, 这些反斜杠转义
字符将被替换为:
                                                                                                                                             
'/a'
    警告(铃声)
                                                                                                                                             
'/b'
    退格
                                                                                                                                             
'/e'
    转意符(非ANSI C)
                                                                                                                                             
'/f'
    换页
                                                                                                                                             
'/n'
    新行
                                                                                                                                             
'/r'
    回车
                                                                                                                                             
'/t'
    水平制表
                                                                                                                                             
'/v'
    垂直制表
                                                                                                                                             
'//'
    反斜杠
                                                                                                                                             
'/''
    单引号
                                                                                                                                             
'/NNN'
    八进制值为NNN(1到3位)的八比特字符.
                                                                                                                                             
'/xHH'
    十六进制值为HH(1到2位)的八比特字符.
                                                                                                                                             
'/cX'
    一个CTRL+X字符.
                                                                                                                                             
    扩展后的结果被单引用, 就像美元符号没有出现过一样.
                                                                                                                                             
3.1.2.5 Locale指定的转换
........................
                                                                                                                                             
    前面加美元符号('$')的双引用字符串将导致该字符串依据当前的locale被
转换. 如果当前locale是C或POSIX, 那么美元符号被忽略. 如果该字符串要被转换
或替换的话, 将依据双引用规则.
                                                                                                                                             
    某些系统使用LC_MESSAGES shell变量所指定的消息类型. 其他一些系统根据
shell变量TEXTDOMAIN的值来创建消息类型的名称, 可能还会加上后缀'.mo'. 如果
你使用TEXTDOMAIN变量, 你可能需要设置变量TEXTDOMAINDIR指向消息类型文件所
在的位置. 还有某些系统以这种形式两个变量都使用: TEXTDOMAINDIR/LC_MESSAGES
/Lc_Messages/TEXTDOMAIN.mo.
                                                                                                                                             
3.1.3 注释
----------
                                                                                                                                             
    在shell的非交互模式, 或者shell的交互模式但同时shopt内部命令的interactive
_comments选项被打开(*参见 4.2 Bash内部命令::)的情况下, 以'#'开头的单词以及
该行其后的字符将被忽略. 在shell的交互模式下如果interactive_comments被关闭,
则注释被禁止. Shell处于交互模式时其interactive_commnets选项缺省是被打开的.
关于如何使shell交互, *参见 6.3 交互式shell::
                                                                                                                                             
                                                                                                                                             

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值