bash简介:
    bash是众多shell中最常用的一种,许多linux发行版将bash设置为默认shell。bash是一种命令解释型语言,是操作系统给用户提供的一种接口,能够将用户标准输入或文件中的命令提交内核执行。

bash基础特性:
1、变量
    编程程序语言:
        强类型:
            定义变量时必须指定类型,参与运算必须符合类型要求,调用为声明
        弱类型:
            无需指定类型,默认均为字符型,参与运算会自动进行隐式类型转换
        注:bash为弱类型语言

    bash中的变量的种类,根据变量的生效范围:
        本地变量:生效范围为当前shell进程,对当前shell之外的其他shell包括当前shell的子shell均无效
        环境变量:对当前shell及子shell都有效;(对其他shell无效)
        局部变量:生效范围为当前sehll进程中某代码片段(通常指函数)
        位置变量:$1,$2,$3,...用于在命令行给脚本传递的参数
        特殊变量:$?, $0, $*, $#, $@,$$
        本地变量

    变量赋值:name='value',可以使用引用赋值:
        (1)可以使直接字符串
        (2)变量引用:name=$var_name
        (3)命令引用:name=`COMMAND`, name=$(COMMAND)

    变量引用:${name} , $name
        ${name}’s
        "":弱引用,其中的变量名会被替换成变量值;
        '':强引用,其中的变量引用不会被替换成变量值,而保持原字符串;

    set:显示已定义的所有变量
    unset var_name:销毁变量             
                   
    环境变量:
        变量声明及赋值:
            export name=value
            declare -x name=value
        变量引用:$name,$(name)
        显示所有环境变量
            export
            env
            printenv
        销毁:
            unset name

    变量命名法则:
        1、不能使用程序中的关键字
        2、只能使用数字、字母及下划线,且不能以数字开头
        3、见名知义,驼峰法则或下划线
    只读变量:(不能被修改,不能销毁,只能等到shell进程结束)
        readonly name
        或 declare -r name
    位置变量:在脚本代码中调用通过命令行传递给脚本的参数
        $1,$2,...:对应调用第1、第2等参数
            shift [n]:左移当前的位置参数,不加参数默认向左移动一位
        $0: 脚本本身的名称
        $*:传递给脚本的所有参数(把所有参数当做一个字符串)
        $@:传递给脚本的所有参数(每一个参数都是一个单独个体)
        $#:参数的个数
        $$:是脚本运行的当前进程ID号


2、history管理命令历史
    登录shell时,会读取命令历史文件~/.bash_history记录下的命令;登录进shell后重新执行的

    命令只    会记录在缓存中,这些命令会在用户退出时追加记录到命令历史文件中(或者使用-a选项)。

    history常用选项:
        -d OFFSET:根据序列号删除历史中指定的命令
        -c:清空历史文件
        -a:追加本次会话新执行的命令历史列表到历史文件.bash_history中
                
        快捷操作:
            !#:调用历史中第#条命令
            !string:调用历史中最近一个以string开头的命令
            !!:执行上一条命令
            !$:调用上一条命令的最后一个参数
                快捷键:ESC, . 或者alt + .

    相关环境变量:
        HISTFILE: ~/.bash_history(用户家目录)
        HISTSIZE:命令历史记录的条数,即history所能显示命令的最多条数。
        HISTFILESIZE:命令历史文件所能记录的最多历史命令条数
        HISTCONTROL:控制命令历史记录方式
            ignoredups: 忽略重复的命令,连续且相同方为"重复"(bash默认)
            ignorespace:忽略所有以空白开头的命令
            ignoreboth:包含ignoredups和ignorespace

        修改环境变量值方式:export 变量名='值'
        变量赋值:把赋值符号后面的数据存储于变量名


        hash:缓存(记录)用户的历史命令路径到内存中,实现系统加速,只记录外部命令路径

    [root@localhost man]# hash
        hits    command
        5    /bin/grep
        1    /bin/egrep
        1    /usr/bin/head
        3    /bin/cat
        4    /usr/bin/man

    hash -r:删除某条命令的缓存记录
    注意:当命令的路径修改之后,需要删除此条命令的缓存记录,否则会报错,提示找不到此命令


3、命令及路径补全(Tab键)
    命令补全:bash根据PATH环境变量定义的路径,自左而右在每个路径搜寻命令名命名的文件,返回第一次找到的命令。

4、命令行展开
    ~:展开为用户的主目录
    ~USERNAME:展开为指定用户的主目录
    {}:可承载一个以逗号分隔的列表,并将其展开为多个路径

5、命令的执行结果状态,两类:        
    1、程序的返回值
    2、程序的执行状态结果

    bash使用特殊变量$?保存最近一条命令的执行状态结果:
        0:成功
        1 - 255:失败

6、命令别名(alias)
    (1) alias
        显示当前shell进程所有可用的命令别名
    (2) alias NAME='VALUE'
    注意:在命令行中定义的别名,仅对当前的shell进程有效;

    仅对当前用户生效(永久):~/.bashrc
    对所有用户生效(永久):/etc/bashrc

    bash进程重新读取配置文件,立即生效:
        source /etc/bashrc
        . /etc/bashrc                
    删除别名:
        unalias NAME
    注意:如果别名同原命令的名称一样,如果要执行原命令,则用"\COMMAND"

7、glob(globbing)
    bash中用于实现文件名"通配"
    通配符:
        * : 任意长度的任意字符
        ?:一个任意字符
        []: 匹配指定范围内的任意单个字符
            [0-9]
            [a-z]:不区分字符大小写,区分用[[:lower:]]
            [A-Z]:不区分字符大小写,区分用[[:upper:]]
        [^]:匹配指定范围外的任意单个字符,[^0-9]

        专用字符集合:
            [:digit:]:数字
            [:lower:]:小写字母
            [:upper:]:大写字母
            [:alpha:]:字母
            [:alnum:]:字母及数字集合
            [:space:]:空格
            [:punct:]:标点符号

   
8、bash的I/O重定向及管道
    打开的文件都有一个fd:file description(文件描述符)
                  
    标准输入:    keyboard,0
    标准输出:    monitor, 1
    标准错误输出:monitor, 2

    I/0重定向:改变标准位置
    输出重定向:COMMAND > NEW_POS, COMMAND >> NEW_POS
        >: 覆盖重定向
        >>: 追加重定向

        set -C: 禁止将内容覆盖输出到已有文件中
                强制覆盖:>|
        set +C:取消禁止

        2>: 覆盖重定向错误输出流
         2>>:追加

    标准输出和错误输出各自定向至不同位置:
        COMMAND > /path/to/file.out 2> /path/to/error.out
    合并标准输出和错误输出为同一个数据流进行重定向:
        &> :覆盖
            COMMAND > /path/to/file.out 2>&1
        &>> :追加           
            COMMAND >> /path/to/file.out 2>&1

    输入重定向:<
        tr:转换或删除字符
            tr [OPTION]... SET1 [SET2]
                tr abc ABC < /etc/fstab
                -d:给定删除字符

    HERE DOCUMENT:<<
        cat << EOF
        cat > /path/to/somefile << EOF        

        [root@localhost ~]# cat > /tmp/test.out << EOF    
        > Hello
        > World
        > EOF
        [root@localhost ~]# cat /tmp/test.out 
        Hello
        World

    管道:
        echo $PATH | tr 'abc' 'ABC'

        tee命令:read from standard input and write to standard output and files
            -a,--append:追加
            echo $PATH | tr 'a-z' 'A-Z' | tee /tmp/path.out


bash配置配置文件:
    按生效范围划分:存在两类:
        全局配置:
            /etc/profile
                /etc/profile.d/*.sh
            /etc/bashrc
        个人配置:
            ~/.bash_profile
            ~/.bashrc
    按功能划分,存在两类:
        profile类:为交互式登录的shell提供配置
            全局:/etc/profile, /etc/profile.d/*.sh
            个人: ~/.bash_profile
            功能:
                (1)用于定义环境变量
                (2)运行命令或脚本

        bashrc类:为非交互式登录的shell提供配置
            全局:/etc/bashrc
            个人:~/.bashrc

            功用:
                (1)定义命令别名
                (2)定义本地变量
    shell登录:
        交互式登录:
            直接通过终端输入账号密码登录;
            使用"su - UserName"或"su -l Username"切换的用户

            读取配置文件的顺序流程:
            /etc/profile --> /etc/profile.d/*.sh --> ~/.bash_profile --> ~/.bashrc --> /etc/bashrc
        非交互式登录:
            su UserName
            图形界面下打开的终端
            执行脚本

            读取配置文件的顺序流程:
            ~/.bashrc --> /etc/bashrc --> /etc/profile.d/*.sh

    编辑配置文件定义的新配置的生效方式:
        (1)重新启动shell进程
        (2)使用source或.命令


终端:
    用户与主机交互
        物理终端:直接接入本机的显示器和键盘设备,console
        虚拟终端:附加在物理终端之上的以软件方式虚拟实现的终端,Centos 6 默认有6个
        ctrl + alt + f1-6
        设备文件路径:/dev/tty#
        图形终端:附加在物理终端之上的以软件方式虚拟实现的终端,
        ctrl + alt + f7        
       模拟终端:图形界面下打开的命令行接口,基于ssh协议或telnet协议等远程方式打开的界面
        设备文件:/dev/pts/#  [0,∞]

交互式接口:启动终端后,在终端设备附加一个交互式应用程序
    GUI:
        X protocol ,window manager,desktop
        Desktop:
            GNOME(c , gtk)
            KDE (C++,qt)
            XFCE(轻量级桌面)
    CLI:
        shell程序:
            sh(bourn)
            csh
            ksh(korn)
            bash(bourn again shell),GPL
            zsh
        命令提示符:prompt
            [root@localhost ~]# echo $PS1
            [\u@\h \W]\$
            prompt:
                管理员:#
                普通用户:$

    查看当前用户默认shell:

    [root@localhost ~]# echo $SHELL
    /bin/bash

    查看系统所有可用的shell:

    [root@localhost ~]# cat /etc/shells
    /bin/sh
    /bin/bash
    /sbin/nologin
    /bin/dash
    /bin/tcsh
    /bin/csh


bash的快捷键:
    Ctrl + l:清屏
    Ctrl + a:跳转至命令开始处
    Ctrl + e:跳转至命令结尾处
    Ctrl + c:取消命令的执行
    Ctrl + u:删除命令行首至光标所在处的所有内容
    Ctrl + k:删除光标所在处至命令行尾的所有内容