bash 的基础特性如下:

  一、命令的别名--alias 命令

   用来定义和显示命令的别名,unalias撤销定义的别名;但是要注意以下几点:

   1.alias的效果仅限于当前shell的生命期;

   2.如果修改.bashrc配置文件,其中保存的别名不会立即生效,只有在重新加载该文件的内容后,才会生效且永久生效;

   3.为了能够保证设置的别名有效,通常两种操作都要做;

 二、命令历史

  shell进程会其会话中保存此前用户提交执行过的命令,history是shell的内置命令

  1.命令语法格式:

  history [-c] [-d OFFSET] [n]

  history -anrw [FILENAME]

  history -ps VALUE [VALUE...]

  -c: 清空命令历史;

  -d offset(偏移量):删除指定命令历史offsethistory显示出来的命令数字

  -r: 从文件读取命令历史至历史列表中;

 -w:把历史列表中的命令追加至历史文件中;

history #:显示最近的#条命令;

  

重复使用命令缓冲区中的命令

  ●!#:再一次执行历史列表中的第#条命令;

  ●!-#:执行倒数第几条命令;

  ●!!:再一次执行上一条命令;

  ●!STRING:再一次执行命令历史列表中最近一个以STRING开头的命令;


重复使用历史命令的一部分

  ●!$:表示最后一次命令中最后一个参数;

  ●ESC,.  最后一次命令中最后一个参数;

  ●Alt+.  真正终端上才可以使用此用法;

  ●!^: 第一个位置的参数

  ●!:NUM  表示最后一次命令中的第NUM个位置的参数;

  ●!SEQUENCE:NUM  表示第SE条命令的第NUM个参数;

  ●!STRING:^|$|*|NUM;

2.与历史相关的bash变量

  HISTSIZE:shell进程可保留的命令历史的条数;

  HISTFILE:持久保存命令历史的文件,默认为.bash_history

  HISTFILESIZE:命令历史文件的存储历史命令数量条数;

  HISTCONTROL:控制命令历史记录的方式

    ignoredups:忽略重复的命令;

    ignorespace:忽略以空白字符开头的命令;

    ignoreboth:以上两者同时生效;

三、快捷键:

 按键组合映射成bash可以识别的命令;

 Ctrl+a:跳转至命令行行首

 Ctrl+e:跳转至命令行行尾

 Ctrl+u:删除行首至光标所在处之间的所有字符;

 Ctrl+k:删除光标所在处至行尾的所有字符;

 Ctrl+l:清屏,相当于clear


四、命令补全机制:

 % SHELL命令的执行过程:

  1.SHELL会根据用户键入“ENTER”来判断用户的输入结束;

  2.SHELL会将收集的命令信息,根据空白字符来分段:第一个分段被理解为命令字段;

  3.判断第一个字段是内部或者外部命令:如果是内部命令,直接运行;如果是外部命令,通过PATH变量所指示的路径信息,去查找相关的位置,以确定是否存在同名文件,如果有就执行,否则报错;

  4.判断选项以及参数是否正确;%

 

两个方面的理解:

 命令本身的字符串补全&&参数的补全;


使用TAB键可以完成命令或者路径的补全:

   注意:如果给出的字符串不是唯一标识,则bash不予不全,再次TAB键,bash给出参考列表;如果参考列表中的内容过多,bash会询问是否显示该列表;


还可以根据提供的参数路径进行补全,如果参数没有任何提示字符串信息,则默认从工作目录查找;

五、shell 的命令行展开(用简单的字符实现bash能够识别的复杂信息)


~: 

  ~ bash会自动将其展开为当前登录用户的家目录;

  ~STR :bash会自动将其展开为以STR为用户名的家目录;

 ~+ :调用SHELL变量”PWD”的值;

 ~- : 调用SHELL变量”OLDPWD”


{}:在其中可以填充一个以”,”分隔的路径列表,bash会将其展开为多个独立的路径;

 例如:mkdir /{a,b}_{c,d} 创建了四个目录:a_c,a_d, b_c, b_d。


六、命令的执行结果

  1.bash通过状态返回值来输出结果:成功:0  失败:1-255

    0:命令执行成功;1,2,127: bash内置的状态返回值;1表示小问题,2表示严重问题,127表示命令本身出现问题;3-126以及128-255:用户自定义的状态信息;

  2.状态返回值保存于bash的特殊变量:$?

  3.引用命令的执行结果:$(COMMAND)或`COMMAND`


任何一个命令都有两种执行结果:

其一:命令的正常输出结果;

与用户需求相关的返回内容 

引用方法:

``:反向单引号—反引号;

$():标准的命令引用格式;

   补充命令:

    wc:统计一个文件的行数,字数以及字节数;

    -c:只显示字节数

    -l:只显示行数

    -w:只显示字数;

其二:命令的执行状态返回值;

  与命令执行成功与否相关的返回内容,保存在bash的一个特殊变量中:$?;


七、引用特性

 ‘ ’ :强引用,凡是被单引号引用的内容,bash一律将其视为普通字符,即便其本身有特殊功能和作业也是如此,但是单引号本身是个例外;

 “ ” :弱引用,被双引号引用的内容,有些特殊的字符仍会保留其特殊含义,比如: $、\、”


八、转义功能:

 \:bash定义的转义字符,只能使其后一个字符失去特殊含义;


九、Globbing,文件名通配,简称为glob;

  匹配模式:元字符(一组代替一个或多个字符的字符)

    具有特殊意义的专用字符,可以用来规定其前导字符在目标对象的出现模式

      *:匹配任意长度的任意字符,包括空字符

      ?:匹配任意单个字符

      []:匹配指定范围内的任意单个字符

      例如[abc]、[a-z]、[A-Z]、[a-zA-Z]、[A-Z]、[0-9]、[a-z0-9]

特殊格式:

[[:upper:]]:所有大写字母

[[:lower:]]:所有小写字母

[[:alpha:]]:所有字母

[[:digit:]]:所有数字

[[:alnum:]]:所有的字母和数字

[[:space:]]:所有空白字符

[[:punct:]]:所有标点符号

   [^]:  匹配指定范围外的任意单个字符

十、输入输出重定向;

  在使用计算机时 实现某种功能的主体是:程序 (= 指令 + 数据;)

    数据是指令操作的对象,在Linux体现就是文件; 

    可以用于输入的设备也是一种文件;

     例如键盘设备,文件系统中的常规文件、网卡声卡设备;

    可以用于输出的设备:文件

     显示器,文件系统的常规文件,网卡声卡…


每一种程序都有三种形式的数据流:

  a).输入数据流:为程序获取数据的数据流;默认的输入数据流的来源是键盘;

  b).输出数据流:将程序所处理的数据结果展示给用户的数据流;默认输出数据流的终点 是显示器;

  c).错误数据流:将程序无法处理或处理过程中出现的问题的结果展示给用户的数据流;默认错误数据流的终点是显示器;


  从键盘实现的输入数据流成为标准输入;

  到显示器上的输出数据流称为标准输出;

  到显示器上的错误数据流称为标准错误输出,简称标准错误;


文件描述符:File Descriptor,FD。

  0:标准输入,stdin

  1:标准输出,stdout

  2:标准错误,stderr



IO重定向:采用非标准设备文件实现的IO操作;


简单来说,

 不是从键盘设备完成的数据流输入,就可以称为输入重定向或者叫做重定向输入;

 不是到显示器设备正确输出数据流就被称为输出重定向,或叫重定向输出 



输出重定向:

  >:覆盖输出重定向

   set –C //开启防误覆盖开关,此开关启后,可以用“>|”符号继续覆盖重定向;

   set +C//关闭防误覆盖

  >>:追加输出重定向



错误重定向:

 2>:覆盖错误重定向

 2>> :追加错误重定向


合并标准输入和标准输出的重定向

  1).&>、&>>(并不是所有bash都支持)

  2).COMMAND >|>> /PATH/TO/SOMEFILE 2>&1

十一、管道:

    | 用来连接命令,注意最前的命令应该具备输出数据流的功能;


十二、bash变量

  前面介绍到声明是程序,简单来说,程序 = 指令 + 数据;

  指令引导硬件和数据操作行为;

  数据:就是文件系统中要进行管理的文件(存储在存储设备中的流式数据),而存储在内存的数据就称为变量;

  所以,变量就是一段连续的内存空间;一段内存空间被平面编址,分为若干cell--8bit;假如我们为这一段内存空间取一个名,就称为变量名;在这段内存空间中所存储的数据,就称为变量的值;

  变量的赋值操作符:=

  赋值方法:VARNAME=VALUE;

  其中变量名VARNAME的命名规范如下:

    1.开头,只能以字母或_为首字符,不能使用数字,后面可以是任意字母数字下划线;

    2.大小写严格区分

    3.要见名知意

    4.书写规范:

      1) 全大写:FILES

      2) 驼峰式:MyFiles

    5.不能与已知变量重名;

 根据不同的编程语言,变量可以分为强变量和弱变量两类; 

    强变量:

      必须在使用前进行声明,而且要声明变量的类型;

      例如 255:

         字符类型:3Bytes

         整数型:1Byte 

         null

    弱变量:

     可以随时使用,随时声明,甚至可以不声明;不对变量类型做硬性要求;如果没有指明变量类   型,统一按字符型对待;bash的变量即为弱变量;

下面介绍一下bash中变量的种类:

    全局变量(环境变量):作用范围是整个shell进程,包括子shell;

    本地变量:作用范围仅是当前登录的shell,不包含子shell

    局部变量:作用范围仅是当前程序段,一般用在函数;

    特殊变量:

       $?:展开为最近一次执行命令的状态返回值(退出状态);

       $#:位置参数的个数;

       $*:从1开始展开为位置参数,当使用双引号引用展开的时候,它展开为以特殊变                量“IFS”的第一个字符分隔的值;

       $@:从1开始展开为位置参数,当使用双引号引用的时候,展开为一个单独的字符串;

       $$:展开为当前shell 的进程标识符;

       $0:展开为shell或者shell脚本的文件名;



变量的使用:

    赋值:

    撤销变量:unset VARNAME

    声明环境变量:export VARNAME

命令 declare

    -a:声明索引数组(如果支持)

    -A:声明关联数组

    -i:声明整型变量

    -l:小写字母

    -u:声明变量并将变量值中的字符转换为大写字母;

    -x:声明变量并将其导出为环境变量;

    -r:声明变量为只读变量(常量);只能进行第一次赋值; 

声明局部变量:local VARNAME=VALUE


注意:一般情况下,声明变量都是现做现用,并不需要修改配置文件;