GNU Bash 手册 (2)

本文详细介绍了Bash Shell的基础特性,包括Bash的由来、基本语法、命令解析流程、引用规则等内容。重点讲解了转义字符、单双引号的使用以及特殊字符的处理方式。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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::
                                                                                                                                             
                                                                                                                                             

译者序毫无疑问,UNIX/Linux最重要的软件之一就是shell,目前最流行的shell被称为Bash(Bourne Again Shell),几乎所有的Linux和绝大部分的UNIX都可以使用Bash。作为系统与用户之间的交互接口,shell几乎是你在UNIX工作平台上最亲密的朋友,因此,学好shell,是学习Linux/UNIX的的开始,并且它会始终伴随你的工作学习。shell是如此地重要,但令人惊奇的是,介绍shell的书没有真正令人满意的。所幸的是,我看到了这本被人称为abs的书,这本书介绍了bash大量的细节和广阔的范围,我遇到的绝大部分的技术问题--无论是我忘记的或是以前没有发现的--都可以在这本书里找到答案。这本使用大量的例子详细地介绍了Bash的语法,各种技巧,调试等等的技术,以循序渐进的学习方式,让你了解Bash的所有特性,在书中还有许多练习可以引导你思考,以得到更深入的知识。无论你是新手还是老手,或是使用其他语言的程序员,我能肯定你能在此书用受益。而本书除了介绍BASH的知识之外,也有许多有用的关于Linux/UNIX的知识和其他shell的介绍。在看到本书的英文版后,我决定把它翻译出来,在Linuxsir论坛上结识了译者之一杨春敏共同翻译这本书,600多页的书是本大部头的书,我们花了6个月的业余时间才翻译完了。关于版权的问题,英文版的作者Mendel Cooper对英文版的版权做了详细的约定,请参考:Appendix Q. Copyright。中文版版权由译者杨春敏和黄毅共同所有,在遵守英文版版权相应条款的条件下,欢迎在保留本书译者名字和版权说明以非盈利的方式自由发布此中文版,以盈利目的的所有行为必须联系英文作者和两位中文译者以获得许可。本书得以成稿,我(黄毅)要多谢我的女朋友,本该给予她的时间我用来了翻译,多谢你的理解,你是一个很棒的女朋友! 译者 杨春敏 黄毅 2006.5.15
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值