BASH融合了:ksh,csh 并避免其缺陷
             
编程语言:
  1.脚本语言:
    以源程序的方式存在,执行前不需要编译,
    而靠一个解释器执行
    为何简便,但执行效率差
    bash,perl, python, ruby, php
    perl最晦涩 python面向对象语法严格
  2.编译型语言:
    编辑——>编译——>连接——>运行 
    1、静态组合 2、动态组合
    执行效率高,但维护复杂
    c, c++,-接近硬件底层
BASH常用命令:
1、命令行编辑 
  快捷键: Ctrl+a ;直接跳到命令行首
           Ctrl+e ;行尾
           Ctrl+u ;删除从光标到行首
           Ctrl+k :删除从光标到行尾
           Ctrl+箭头 :跳一个单词

2、文件名统配
 通配符:
   *:表示任意长度的任意字符  例:ls * ; ls *.log
   ?: 任意单个字符  例 : ls ?.log
   []:指定范围内的任意单个字符, [a-z] [abc]
       例: ls [abc].log
      [^abc], ^:表示取反 不包括abc
      [a-zA-z0-9]指定字符范围
   [:keyword:] : [:lower:],[:upper:],[:punct:],
   [:space:],[:alpha:].[:alnum:][:digit:]-(数字)
    man 7  glob :可以上查看所有
    [^[:alpha:]]  :: "^"表示取反
 
3、命令补全和路径补全    
    命令补全:
      echo $PATH 定义的路径下找到命令进行补全. 
    路径补全:
      指定的路径下
     
4、命令行展开
    ~ :展开为对应用户的家目录
        cd ~到家目录
    {}:展开多条路径
        mkdir -pv x/{y,z/{1,2}}
        mkdir -pv {x,y}_{1,2} 多项展开

5、命令展开/命令扩展
    $():意义同下
    `` 反引号: 把一个命令的执行结果当成一个命令的
              对象来使用
        例: mkdir #(date"+%Y-%m-%d-%H-%M-%S")
              ls -l `which passwd`
 
脚本::命令的堆砌
bash脚本:
  编写:
  #!/bin/bash ,  (-称为shabang) 
  #

  DIR=`/tmp/scrips2`
  mkdir -v $DIR
  unset DIR  (施放变量)

 除第一行"#"外 其他为注释
 脚本中变量: 脚本执行完施放脚本中所有变量.
 脚本的执行: 要有执行权限  (当前目录下输入./'脚本名' 或输入 bash '脚本名')

脚本的调试:  bash -n '脚本名'   用于检查是否有语法错误.

                      bash -x '脚本名'  用于跟踪脚本执行的过程.

变量:命名的内存空间  通常只对当前shell有效
 

   变量引用:"" 用双引号引用
   "" : 为弱引用   touch "a b"  可以进行变量替换.
   '' :为强引用   touch '$ab'  不会进行变量替换.
   "\ "避免被解释 例: 显示"$"  使用"\$".
bash,变量不需要声明,变量不区分类型,默认字符串型,不能直接参与数学运算。
  例: 变量名=“string”
       set 变量名=“string”
       unset 变量名

定义变量:
 NAME=Jerry
 echo $NAME 显示变量值
 echo ${NAME} 标准格式
 echo:
   -n :不显示换行符
   -e :转义符
 
    man echo 中有详细介绍

1、变量分为本地变量/局部变量
2、环境变量 对当前shell 对子shell都有效,可在shell中打开子shell
   export,导出一个变量
   export A=3  := : A=3  export A
 查看:
 export,显示当前所有变量 declare,声明变量
  DISPLY,定义显示
  HISTSIZE,历史命令保存条数
  HOME,定义当前用户的家目录
  PATH, :隔开
  OLDPWD,PWD
  SHELL
 env,可显示当前变量,在某个特定环境下运行某命令
3、特殊变量
 bash内置变量
 $* 用于引用所有位置参数,每一个变量是一个独立的字符串
Shell及变量_linux$@ 用于引用所有位置参数,把所有的变量当做一个字符串
$# 用于引用命令行传递的位置参数的个数
$0 表示脚本名字自身 eg:echo “basename$0"(basename用于命令替换)
$$ 当前进程的进程号
$? 用于引用上一个命令的执行状态结果,echo ”$?"  0表示成功,
    大于0表示错误,错误有不同返回值

$_ 用于引用脚本中最后一个命令的参数
$! 最后执行的后台命令的PID
$- 用于引用当前脚本中命令的选项的引导符

4、位置变量
 $1,$2,$3  当数值大于10时用 ${n}表示
例:
#!/bin/bash

 echo "$1+$2=$[$1+$2]"
 echo "$1-$2=$[$1-$2]"
 echo "$1/$2=$[$1/$2].$[$1%$2*10/$2]"
 echo "$1*$2=$[$1*$2]"

变量执行数学运算::
echo "$[$A+$B]" / echo "$(($A+$B))"

5、read:  等待用户从键盘输入一个值,并赋给一个指定的变量
   read A  键盘输入 保存到A
   read -p "XXXX" A 显示 "XXXX" 等待键盘输入变量A的值

  read [option] VAR1 VAR2 VAR3
     -t  等待输入时间 超时时间间隔
     -p 在输入前打印一个值 "..."
     -a 把读入的信息保存在数组当中

6、BASH的命令别名:
   alias,
   例:alias cls=clear
       alias cdnet=’cd /etc/sysconfig/network-scripts'
  撤销: unalias cdnet    (未保存,没有永久性,重启失效) 
保存:
 全局,局部. 应用范围越小越有效.
 全局,/etc/profile,/etc/profile.d/*,/etc/bashrc
 局部,~/.bash_profile,~/.bashrc,~/.bash_logout
1、profile类:
  设置环境变量, 即运行用户登陆是要执行的一些命令
2、bashrc类
  设置别名
  设置本地变量,只对当前shell有效不对子shell有效
Shell的分类::
  1、交互式登陆式shell
    登陆过程:
      1、/etc/profile (PATH) ——>/etc/profile.d/*——

>~/.bash_profile ——>/etc/bashrc
       越后优先级越高
  2、非交互式登陆shell
    系统自动执行的,不需用户登陆的
     ~/.bashrc ——>/etc/bashrc ——>/etc/profile.d/*
重读配置文件:
   source /etc/profile
   . /etc/profile
  (可能会影响其他变量使用)