zoukankan      html  css  js  c++  java
  • 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 (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 的基本语法
    · 最简单的例子 —— Hello World!
    · 关于输入、输出和错误输出
    · BASH 中对变量的规定(与 C 语言的异同)
    · BASH 中的基本流程控制语法
    · 函数的使用

    在 bash 中定义环境变量的标准方法是:
    $ myvar='This is my environment variable!'
    以上命令定义了一个名为 "myvar" 的环境变量,并包含字符串 "This ismy environment variable!"。
    以上有几点注意事项:

    第一,在等号 "="的两边没有空格,任何空格将导致错误(试一下看看)。
    第二个件要注意的事是:虽然在定义一个字时可以省略引号,但是当定义的环境变量值多于一个字时(包含空格或制表键),引号是必须的。
    注意:有关如何在 bash 中使用引号的非常详尽的信息,请参阅 bash帮助页面中的“引用”一节。特殊字符序列由其它值“扩展”(替换)确实使bash 中字符串的处理变得复杂。
    第三,虽然通常可以用双引号来替代单引号,但在上例中,这样做会导致错误。为什么呢?因为使用单引号禁用了称为扩展的bash 特性,其中,特殊字符和字符系列由值替换。例如,"!"字符是历史扩展字符,bash通常将其替换为前面输入的命令。
    实际使用环境变量。这有一个例子:
    $ echo $myvarThis is my environment variable!
    通过在环境变量的前面加上一个 $,可以使 bash 用 myvar的值替换它。这在 bash术语中叫做“变量扩展”。但是,这样做将怎样:
    $ echo foo$myvarbarfoo
    我们希望回显 "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 ",myenvvar);}

    参数说明
    -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规定的标准。

    备注:随笔中内容来源于网上资料整理,仅供参考。

  • 相关阅读:
    1058 A+B in Hogwarts (20)
    1046 Shortest Distance (20)
    1061 Dating (20)
    1041 Be Unique (20)
    1015 Reversible Primes (20)(20 分)
    pat 1027 Colors in Mars (20)
    PAT 1008 Elevator (20)
    操作系统 死锁
    Ajax的get方式传值 避免& 与= 号
    让IE浏览器支持CSS3表现
  • 原文地址:https://www.cnblogs.com/Alanf/p/7741590.html
Copyright © 2011-2022 走看看