当前位置首页 > 百科> 正文

bash

2019-05-01 17:48:36 百科
bash

bash

bash 是一个为GNU计画编写的Unix shell。它的名字是一系列缩写:Bourne-Again SHell — 这是关于Bourne shell(sh)的一个双关语(Bourne again / born again)。Bourne shell是一个早期的重要shell,由史蒂夫·伯恩在1978年前后编写,并同Version 7 Unix一起发布。bash则在1987年由布莱恩·福克斯创造。在1990年,Chet Ramey成为了主要的维护者。

基本介绍

  • 中文名:重击
  • 外文名:bash
  • 命令语法:Bourne shell命令语法的超集
  • 全称:Bourne-Again Shell
  • 类别:电脑程式

概念

Bash (GNU Bourne-Again Shell) 是许多Linux发行版的默认Shell。事实上,还有许多传统UNIX上用的Shell,例如tcsh、csh、ash、bsh、ksh等等,Shell Script大致都类同,当您学会一种Shell以后,其它的Shell会很快就上手,大多数的时候,一个Shell Script通常可以在很多种Shell上使用。
bash是大多数Linux系统以及Mac OS X默认的shell,它能运行于大多数类Unix风格的作业系统之上,甚至被移植到了Microsoft Windows上的Cygwin系统中,以实现Windows的POSIX虚拟接口。此外,它也被DJGPP项目移植到了MS-DOS上。
bash的命令语法是Bourne shell命令语法的超集。数量庞大的Bourne shell脚本大多不经修改即可以在bash中执行,只有使用了Bourne的特殊变数或内置命令的脚本才需要修改。 bash的命令语法很多来自Korn shell (ksh) 和 C shell (csh), 例如命令行编辑,命令历史,目录栈,$RANDOM 和 $PPID 变数,以及POSIX的命令置换语法: $(...)。作为一个互动式的shell,按下TAB键即可自动补全已部分输入的程式名、档案名称、变数名等等。

环境变数

在 bash 和几乎所有其它 shell中,用户可以定义环境变数,这些环境变数在以 ASCII字元串存储。环境变数的最便利之处在于:它们是 UNIX进程模型的标準部分。这意味着:环境变数不仅由 shell脚本独用,而且还可以由编译过的标準程式使用。当在 bash中“导出”环境变数时,以后运行的任何程式,不管是不是 shell脚本,都可以读取设定。一个很好的例子是 vipw 命令,它通常允许 root用户编辑系统口令档案。通过将 EDITOR环境变数设定成喜爱的文本编辑器名称,可以配置vipw,使其使用该编辑器,而不使用 vi,如果习惯于 xemacs 而确实不喜欢vi,那幺这是很便利的。
在 bash 中定义环境变数的标準方法是:
$ myvar='This is my environment variable!'
以上命令定义了一个名为 "myvar" 的环境变数,并包含字元串 "This ismy environment variable!"。以上有几点注意事项:第一,在等号 "="的两边没有空格,任何空格将导致错误(试一下看看)。第二个件要注意的事是:虽然在定义一个字时可以省略引号,但是当定义的环境变数值多于一个字时(包含空格或製表键),引号是必须的。
注意:有关如何在 bash 中使用引号的非常详尽的信息,请参阅 bash帮助页面中的“引用”一节。特殊字元序列由其它值“扩展”(替换)确实使bash 中字元串的处理变得複杂。本系列将只讲述最常用的引用功能。
第三,虽然通常可以用双引号来替代单引号,但在上例中,这样做会导致错误。为什幺呢?因为使用单引号禁用了称为扩展的bash 特性,其中,特殊字元和字元系列由值替换。例如,"!"字元是历史扩展字元,bash通常将其替换为前面输入的命令。(本系列文章中将不讲述历史扩展,因为它在bash 编程中不常用。有关历史扩展的详细信息,请参阅 bash帮助页中的“历史扩展”一节。)儘管这个类似于宏的功能很便利,但我们现在只想在环境变数后面加上一个简单的感叹号,而不是宏。
现在,让我们看一下如何实际使用环境变数。这有一个例子:
$ echo $myvarThis is my environment variable!
通过在环境变数的前面加上一个 $,可以使 bash 用 myvar的值替换它。这在 bash术语中叫做“变数扩展”。但是,这样做将怎样:
$ echo foo$myvarbar
我们希望回显 "fooThis is my environmentvariable!bar",但却不是这样。错在哪里?简单地说,bash变数扩展设施陷入了困惑。它无法识别要扩展哪一个变数:$m、$my、$myvar、$myvarbar 等等。如何更明确清楚地告述 bash引用哪一个变数?试一下这个:
$ echo foo${myvar}barfooThis is my environment variable!bar
如您所见,当环境变数没有与周围文本明显分开时,可以用花括弧将它括起。虽然$myvar 可以更快输入,并且在大多数情况下正确工作,但 ${myvar}却能在几乎所有情况下正确通过语法分析。除此之外,二者相同,将在本系列的余下部分看到变数扩展的两种形式。请记住:当环境变数没有用空白(空格或製表键)与周围文本分开时,请使用更明确的花括弧形式。
回想一下,我们还提到过可以“导出”变数。当导出环境变数时,它可以自动地由以后运行的任何脚本或可执行程式环境使用。shell脚本可以使用 shell 的内置环境变数支持“到达”环境变数,而 C程式可以使用 getenv() 函式调用。这里有一些 C代码示例,输入并编译它们 -- 它将帮助我们从 C的角度理解环境变数:
myvar.c -- 样本环境变数 C 程式#include <stdio.h>#include <stdlib.h>int main(void) { char *myenvvar=getenv("EDITOR"); printf("The editor environment variable is set to %s\n",myenvvar);}
将上面的代码保存到档案 myenv.c中,然后发出以下命令进行编译:
$ gcc myenv.c -o myenv
现在,目录中将有一个可执行程式,它在运行时将列印 EDITOR环境变数的值(如果有值的话)。这是在我机器上运行时的情况:
$ ./myenvThe editor environment variable is set to (null)
啊... 因为没有将 EDITOR 环境变数设定成任何值,所以 C程式得到一个空字元串。让我们试着将它设定成特定值:
$ EDITOR=xemacs$ ./myenvThe editor environment variable is set to (null)
虽然希望 myenv 列印值"xemacs",但是因为还没有导出环境变数,所以它却没有很好地工作。这次让它正确工作:
$ export EDITOR$ ./myenvThe editor environment variable is set to xemacs
现在,如您亲眼所见:不导出环境变数,另一个进程(在本例中是示例 C程式)就看不到环境变数。顺便提一句,如果愿意,可以在一行定义并导出环境变数,如下所示:
$ export EDITOR=xemacs
这与两行版本的效果相同。现在该演示如何使用 unset来除去环境变数:
$ unset EDITOR$ ./myenvThe editor environment variable is set to (null)

参数说明

-c字元串
若用-c参数,则bash从字元串中读入命令,如果字元串后还有变数就被设定为从$0开始的位置参数。
-i
若用-i参数,则bash是互动的。
-s
若用-s参数,则bash从标準输入中读入命令(在执行完-c带的命令之后。)直到输入exit。
-
单一的号表明参数执行完毕,并且禁止此后所跟参数,后面的所有变数都被看作是档案名称。
-norc
如果bash是互动的,则不执行个人初始化档案:-/.bashrc,如果bash作为sh来运行,这个参数预设是关闭的。
-noprofile
不执行系统範围的启动档案/etc/profile也不执行个人的启动档案-/.bash_profile,-/.bash_login或-/.profile,预设情况下,bash作为登录的shell时以这些档案作为启动档案。
--refile档案名称
如果bash是互动的,则以此档案作为bash的启动档案。替代-/.bashrc。
-version
在bash开始时显示此bash的版本号。
-quiet
不显示版本号和其他信息,这是预设值。
-login
激活bash,伪装为登录shell。
-nobraceexpansion
不执行大括弧扩展。
-nolineediting
在互动状态下不使用GNU的readline库去读取命令。即取消了命令行编辑功能。
-posix
改变bash的行为,使其符合Posix 1003.2规定的标準。

外界评价

Linux之父Linus对BASH的描述:
“我下载了一个叫Bourne Shell的外壳程式。它是UNIX的初始外壳程式之一,可以从网际网路上免费下载,名字来源于一个难听的双关语。编写该外壳程式的家伙名叫波恩(英文中的“忍受”或“出生”之意――译注),所以这个程式就叫做“Bourne-Again-Shell”(“再次忍受或再次降生外壳程式”――译注),或一般被称为BASH(bash的英文意为“重击”――译注)。”
BASH的正确缩写:
BASH = GNU Bourne-Again Shell,BASH 是 GNU 组织开发和推广的一个项目。
BASH的作者和产生:
Bourne shell 的作者是 Steven Bourne,它是 UNIX 最初使用的 Shell 并且在每种 UNIX 上都可以使用。
而BASH 与 Bourne shell 完全向后兼容,是Bourne shell的扩展。
双关语的经典之处:.
[1]作者名叫Steven Bourne,“bourne”与“born”的发音相近,而born有“出生”和“忍受”的含义。
[2]Bourne-Again字面意思代表了它是“Bourne shell”l的一种扩展,而暗示“borne-again”、“born-again”则有“重生”和“再次忍受”的意思。(我想作者应该更喜欢“重生”)
[3]它的简写“bash”的意思是“重击”,暗示它的出现是一次强有力的重击。

基本语法

· 最简单的例子 —— Hello World!
· 关于输入、输出和错误输出
· BASH 中对变数的规定(与 C 语言的异同)
· BASH 中的基本流程控制语法
· 函式的使用
声明:此文信息来源于网络,登载此文只为提供信息参考,并不用于任何商业目的。如有侵权,请及时联系我们:baisebaisebaise@yeah.net