Bash:一个出色的 Shell 工具

bash,Unix shell的一种,在1987年由布莱恩·福克斯为了GNU计划而编写。1989年发布第一个正式版本,原先是计划用在GNU操作系统上,但能运行于大多数类Unix系统的操作系统之上,包括Linux与Mac OS X v10.4都将它作为默认shell。它也被移植到Microsoft Windows上的Cygwin与MinGW,或是可以在MS-DOS上使用的DJGPP项目。在Novell NetWare与Andriod在上也有移植。1990年后,Chet Ramey成为了主要的维护者。

为Bourne shell的后继兼容版本与开放源代码版本,它的名称来自Bourne shell(sh)的一个双关语(Bourne again / born again):Bourne-Again SHell。

语法与特性

bash的命令语法是Bourne shell命令语法的超集。数量庞大的Bourne shell脚本大多不经修改即可以在bash中执行,只有那些引用了Bourne特殊变量或使用了Bourne的内置命令的脚本才需要修改。bash的命令语法很多来自Korn shell(ksh)和C shell(csh),例如命令行编辑,命令历史,目录栈,$RANDOM$PPID变量,以及POSIX的命令置换语法:$(...)。作为一个交互式的shell,按下TAB键即可自动补全已部分输入的程序名,文件名,变量名等等。

bash的语法针对Bourne shell的不足做了很多扩展。其中的一些列举在这里。

使用整数

与Bourne shell不同的是bash不用另外生成进程即能进行整数运算。bash使用((...))命令和$[...]变量语法来达到这个目的:

((...))命令可以用于条件语句,因为它的退出状态是0或者非0(大多数情况下是1),可以用于是与非的条件判断:

((...))命令支持下列比较操作符:’==‘, ‘!=‘, ‘>‘, ‘<‘, ‘>=‘,和’<=‘。

bash不能在自身进程内进行浮点数运算。当前有这个能力的unix shell只有Korn shell和Z shell。

输入输出重定向[编辑]

bash拥有传统Bourne shell缺乏的I/O重定向语法。bash可以同时重定向标准输出和标准错误,这需要使用下面的语法:

这比等价的Bourne shell语法”command > file 2>&1“来的简单。2.05b版本以后,bash可以用下列语法重定向标准输入至字符串(称为here string):

如果字符串包括空格就需要用引号包裹字符串。

例子: 重定向标准输出至文件,写数据,关闭文件,重置标准输出。

打开及关闭文件

抓取外部命令的输出

进程内的正则表达式[编辑]

bash 3.0支持进程内的正则表达式,使用下面的语法:

正则表达式语法同regex(7) man page所描述的一致。正则表达式匹配字符串时上述命令的退出状态为0,不匹配为1。正则表达式中用圆括号括起的子表达式可以访问shell变量BASH_REMATCH,如下:

使用这个语法的性能要比生成一个新的进程来运行grep命令优越,因为正则表达式匹配在bash进程内完成。如果正则表达式或者字符串包括空格或者shell 关键字,(诸如’*‘或者’?‘),就需要用引号包裹。Bash 4 开始的版本已经不需要这么做了。

转义字符

$'string'形式的字符串会被特殊处理。字符串会被展开成string,并像C语言那样将反斜杠及紧跟的字符进行替换。反斜杠转义序列的转换方式如下:

转义字符
转义字符 扩展成…
\a 响铃符
\b 退格符
\e ANSI转义符,等价于\033
\f 馈页符
\n 换行符
\r 回车符
\t 水平制表符
\v 垂直制表符
\\ 反斜杠
\' 单引号
\nnn 十进制值为nnn的8-bit字符(1-3位)
\xHH 十六进制值为HH的8-bit字符(1或2位)
\cx control-X字符

扩展后的结果将被单引号包裹,就好像美元符号一直就不存在一样。

双引号包裹的字符串前若有一个美元符号($"...")将会使得字符串被翻译成符合当前locale的语言。如果当前locale是C或者POSIX,美元符号会被忽略。如果字符串被翻译并替换,替换后的字符串仍被双引号包裹。

启动脚本

bash启动的时候会运行各种不同的脚本。

当bash作为一个登录的交互shell被调用,或者作为非交互shell但带有--login参数被调用时,它首先读入并执行文件/etc/profile。然后它会依次寻找~/.bash_profile~/.bash_login,和~/.profile,读入并执行第一个存在且可读的文件。--noprofile参数可以阻止bash启动时的这种行为。

当一个登录shell退出时,bash读取并执行~/.bash_logout文件,如果此文件存在。

当一个交互的非登录shell启动后,bash读取并执行~/.bashrc文件。这个行为可以用--norc参数阻止。--rcfile file参数强制bash读取并执行指定的file而不是默认的~/.bashrc

如果用sh来调用bash,bash在启动后进入posix模式,它会尽可能模仿sh历史版本的启动行为,以便遵守POSIX标准。用sh名字调用的非交互shell不会去读取其他启动脚本,--rcfile参数无效。

当bash以POSIX模式启动时(例如带有--posix参数)它使用POSIX标准来读取启动文件。在此模式下,交互shells扩展变量ENV,从以此为文件名的文件中读取命令并执行。

bash会探测自己是不是被远程shell守护程序运行(通常是rshd)。如果是,它会读取并执行~/.bashrc中的命令。但是rshd一般不会用rc相关参数调用shell,也不会允许指定这些参数。

官方网站:http://www.gnu.org/software/bash/

1 收藏

资源整理者简介:伯小乐

伯乐在线小编一枚~~~~PS:我不是@小编辑,不要问我了 个人主页 · 贡献了46个资源 · 253


直接登录

推荐关注

按分类快速查找

关于资源导航
  • 伯乐在线资源导航收录优秀的工具资源。内容覆盖开发、设计、产品和管理等IT互联网行业相关的领域。目前已经收录 1439 项工具资源。
    推送伯乐头条热点内容微信号:jobbole 分享干货的技术类微信号:iProgrammer