一、Bash是什么?

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

        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 v10.4默认的shell,它能运行于大多数Unix风格的操作系统之上,甚至被移植到了Microsoft Windows上的Cygwin系统中,以实现windows的POSIX虚拟接口。此外,它也被DJGPP项目移植到了MS-DOS上。

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

二、Bash特性介绍。

    1、命令历史。

        1)环境变量:$HISTSIZE,设置命令的历史保存最大条数

                     $HISTFILE,用户退出时的持久保存位置,通常为用户家目录下的.bash_history

                     $HISTFILESIZE,命令保存文件中可保存的命令最大条数

                     $HISTCONTROL,命令历史保存规则:    ignoredups,忽略重复的命令,连续相同的命令才能匹配

                                                     ignorespace,忽略以空白字符打头的命令

                                                     ignoreboth,以上二者同时生效

        2)命令用法。

            history N:显示最近的N条,包括当前命令本身

            history -c:清空命令历史

            history -d offset:删除指定的偏移处的命令条目

            history -a [/path/to/file]:将当前会话的命令历史写入指定文件

        3)调用命令历史。

            !#:执行命令历史的第#条命令

            !!:执行上一条历史命令

            !string:执行命令历史由最后一次以string开头的命令

            !$:调用上一条命令的最后一个参数

            "ESC",".":先按ESC再按"." 功能同上

    2、命令补全,

       路径补全:每个绝对路径都可以切割为两部分,basename(基名)、dirname(目录名)

    3、状态返回值:每个命令执行结束后,会有一个执行状态返回值,有效范围0-255,0表示执行成功,1-255表示执行失败,使用特殊变量"$?"可获取最近一条命令的状态返回值, #echo $?

    4、命令行展开:~表示用户家目录,~USERNAME指定用户的家目录

                   {}:/tmp/{x,y}展开为  /tmp/x,/tmp/y

    5、命令别名和命令引用:通过命令alias定义命令别名

                           定义命令别名:alias grep="grep --color"

                           撤销别名:unalias grep,unalias -a撤销所有别名

    6、bash支持的引用:

                    ''

                    ""

                    ``:引用一个命令的执行结果,$()也是一样

    7、文件名通配:

                  *:任意长度的任意字符
                  ?:匹配任意单字符
                  []:匹配指定范围内的任意单字符
                          [abc],[a-z],[0-9],[0-9a-z]
                  [^]:匹配指定范围以外的任意单字符
                            [^0-9a-z]
                   [:space:]  所有空白字符
                   [:punct:]  所有标点符号
                   [:lower:]  所有小写字母
                   [:upper:]  所有大写字母
                   [:digit:]  所有数字
                   [:alnum:]  所有字符集合
                   [:alpha:]  所有字母集合

    8、输入、输出重定向和管道

        标准输入:0    
        标准输出:1
        错误输出:2
   重定向:改变其标准位置
   输出重定向:COMMAND > POSITION  
   错误重定向:COMMAND 2> POSITION 
   合并重定向:COMMAND > POSITION 2>&1
   分别重定向:COMMAND > POSITION 2> POSITION2
   输入重定向:COMMAND < POSITION

        

    9、快捷键

        Ctrl+a:跳转至命令行首

        Ctrl+e:跳转至命令行尾

        Ctrl+u:删除命令行首至当前光标所在处之前的所有内容

        Ctrl+k:删除当前光标所在处至命令行尾的所有内容

        Ctrl+l:清屏,类似clear命令

        Ctrl+z:把当前命令送至后台执行

    10、变量

1)bash变量类别
    本地变量:只对当前shell进程有效,对其他shell进程无效,包括当前进程的子进程
            变量赋值:VAR_NAME=VALUE
    环境变量:对当前shell进程及其子shell有效,对其他的shell进程无效
            变量赋值:export VAR_NAME=VALUE
            撤销变量:unset VAR_NAME
            只读变量:readonly VAR_NAME
    局部变量:对shell脚本中某代码片段有效,通常用于函数本地
            变量赋值:local VAR_NAME=VALUE
    位置变量:对命令参数生效
            如:$1指参数1,$2指参数2
    特殊变量:例如$?,显示状态返回值
              $RANDOM 显示随机数字
2)变量命名
    1、不能使用程序中的关键字;如:if,case,for
    2、只能使用数字、字母和下划线,且不能以数字开头
    3、命名要规范,见名知义
3)变量类型
    数值型,字符型,布尔型
    类型转换

    11、bash的配置文件

profile类:为交互式登录的用户提供配置
        全局:/etc/profile    /etc/profile.d/*.sh
        用户:~/.bash_profile
        功用:设定环境变量,运行命令或脚本
bashrc类:为非交互式的用户提供配置
        全局:/etc/bashrc
        用户:~/.bashrc
        功用:设定本地变量,定义命令别名
登录类型:交互式,直接通过终端输入帐号和密码登录,su - username
          非交互式,图形界面下打开的终端、执行脚本、su username
交互登录的用户:/etc/profile --> /etc/profile.d/*.sh --> ~/.bash_profile --> ~/.bashrc --> /etc/bashrc
非交互登录的用户:~/.bashrc --> /etc/bashrc --> /etc/profile.d/*.sh