SHELL:
  用户与操作系统之间完成交互式操作的一个接口程序,为用户提供简化了的操作。

  上世纪70年代中期,Bell实验室,由bourne开发,bourne shell,简称sh;
  Bill joy:创建 C shell ,简称csh;衍生版:tcsh
  David korn :开发了korn shell  简称为ksh
  GNU:开发  bourne again shell,简称 bash(linux系统中默认的shell程序)
  zsh:最终shell,功能非常强大;

  当前系统中所有可以支持的安全shell:/etc/shells
(注意:1.除了/sbin/nologin之外,其他的shell都可以用来测试使用
2.在更换shell时,最好在bash中更换其他shell,如果已经换成了其他shell,就使用exit命令返回至bash,再行切换)

在命令前加\意味着用命令本身,而非其所指向的命令。(例cp=cp -i    \cp 就是用cp本身)
Bash特性:
  一、命令的别名----(自定义命令)
alias   :定义或显示别名
alias [-p] [名称[=值] ... ]
注意:如果alias命令不带任何选项参数,则表示显示所有已经定义并生效的别名设置。

# alias   ALIAS=”COMMAND[OPTION]...[ARGUMENT]...”


unalias :从别名定义列表中删除每一个“名字”。
格式:unalias  [-a] 名称[名称 ...]



注意:无论使用alias命令还是unalias命令,其功能都会立即生效;此二命令的生命周期仅为当前shell的生命期,一旦注销登陆,相当于关闭了bash,则使用alias命令定义的别名或unalias命令删除的别名操作会立即失效。

当自定义的命令已存在的情况下,优先执行自定义命令
对于每个用户来说,都有一个私有的bash的配置文件,就在用户的家目录中的一个隐藏文件,文件名为.bashrc;其主要功能就是用来保存命令的别名的定义。
注意:在对于此文件中的命令别名进行编辑并保存之后,在当前已经运行的bash中并不会立即生效,需要重新加载此文件在能是配置生效,以下两种操作皆可实现。
1.source=.  命令---执行文件中定义的命令。
2.重启bash:注销之后再次登陆即可。


source/.  命令:在当前 shell 中执行一个文件中的命令。
格式:. /source 文件名 [参数]


二、bash的快捷键
C:表示ctrl键
M:表示alt键
E:表示ESC键
DEL:表示backspace键

C-l:清屏,相当于clear命令;
C-a:将光标跳转至命令行编辑模式的行首;
C-e:将光标跳转至命令行编辑模式的行尾;
C-k:删除命令行编辑模式的光标所在位置至行尾的内容;
C-u:删除命令行编辑模式的光标所在位置至行首的内容;
C-c:结束前台进程;
M-.:引用上一个命令中的最后一个参数;(在Xshell中不管用)
E,.(按ESC松手后按点):功能同上;


三、命令历史:
Bash进程会保存其会话中的用户曾经执行过的命令,以方便用户重复执行某个命令操作;
命令历史包括两个方面:
 1.用户曾经执行过的命令;
 2.用户曾经执行过的命令的路径;

在bash中有一个内置的变量--PATH,PATH变量的值为当前系统中所有的命令的文件所在的路径的集合;

命令是如何被bash执行的?
 bash会将命令行的内容按照空白字符进行切片,分析第一个切片内容:
  1.判断第一个切片内容是内部命令还是外部命令,如果是内部命令则直接运行,如果是外部命令,先找hash表中的路径缓存,如果有则直接执行,否则需要通过查找PATH变量中所包含的路径中,是否有对应名称的文件;

使用hash命令查看被记住的命令文件的路径;
 -r:清空hash表
使用history命令查看被记住的命令的命令行参数;
history:现实或操纵历史列表
-c:清空历史缓冲区中的命令历史纪录
-d+ OFFSET:删除指定的历史命令条目


重复执行历史缓冲区中的命令:
!- NUMBER:重复执行历史缓冲区中编号为“NUMBER”的命令
  !-STRING:重复执行理事缓冲区中以“STRING”开头的最后一次执行过的命令;
  !?+STRING:重复执行历史缓冲区中包含了“STRING”的最后一次执行过的命令;
  !-NUMBER:重复执行历史缓冲区中倒数第“NUMBER”条命令;
  使用上、下Arrow可以从历史缓冲区中调用命令,回车后执行;
C-r:在历史缓冲区中实施搜索,回车之后执行;

!$:在历史缓冲区中调用最后一个命令的最后一个参数;
!^:在历史缓冲区中调用最后一个命令的第一个位置的参数;
!:NUMBER:历史缓冲区中调用最后一个命令的第NUMBER位置的参数;

!SEQUENCE:NUMBER:历史缓冲区中调用第SEQUENCE条命令的第NUMBER位置的参数;



在bash中与命令历史相关的内置变量:
HISTSIZE:历史缓冲区中能够保存的命令历史的最大条目数量;默认是1000;
HISTFILESIZE:在用户的家目录下面~/.bash_history文件中能够保存的命令历史的最大条目数量,默认为1000;
HISTTIMEFORMAT:在命令历史缓冲区中记录历史命令时,同时记录命令的执行时间戳标记;可以使用date命令的FORMAT来表示时间的记录格式;默认为空;
HISTCONTROL:控制命令历史的记录方式;
  Ignoredups:连续且相同的命令不会被记录到历史缓冲区;此为默认值;
  Ignorespace:以空白字符开头的命令不会被记录到历史缓冲区;
  Ignoreboth:上述两种情况都不会被记录到历史缓冲区;



四、命令补全(TAB键的使用)
包括两个方面的内容:
 1.构成命令字符串的补全;
  参考PATH变量中的路径,对命令进行补全;
  如果给出的字符串在PATH变量对应的路径中是唯一的,则直接补全命令;
  如果给出的字符串在PATH变量对应的路径中不唯一,则bash给出提示;
 2.命令中参数所对应的字符串补全;
  根据给出的路径进行补全:
   如果给出的字符串在给出的路径中是唯一的,则直接补全命令;
   如果给出的字符串在给出的路径中不唯一,则bash给出提示;



五、命令行展开
     1.~展开:
~:bash会自动将其展开为当前登录用户的家目录;
~STRING:bash会自动将其展开为以STRING为用户名的用户的家目录;

~+:调用bash的内置变量PWD的值;
~-:调用bash的内置变量OLDPWD的值;


2.{}展开:
  在“{}”中,可以填充一个以“,”分隔的路径列表,bash会将其展开为多个独立的路径;
示例: ~]# mkdir  -pv  /china/{a,b,c}/{d,e,f}
mkdir: 已创建目录 "/china"
mkdir: 已创建目录 "/china/a"
mkdir: 已创建目录 "/china/a/d"
mkdir: 已创建目录 "/china/a/e"
mkdir: 已创建目录 "/china/a/f"
mkdir: 已创建目录 "/china/b"
mkdir: 已创建目录 "/china/b/d"
mkdir: 已创建目录 "/china/b/e"
mkdir: 已创建目录 "/china/b/f"
mkdir: 已创建目录 "/china/c"
mkdir: 已创建目录 "/china/c/d"
mkdir: 已创建目录 "/china/c/e"
mkdir: 已创建目录 "/china/c/f"





六、命令执行结果
在bash中,命令的执行结果有两种:
 1.执行命令的输出结果;
    根据用户的需求获取到的命令执行的正常输出结果;
    命令引用/命令替换:
``相当于$()
``:反向单引号,引用命令执行的输出结果;
 2.执行命令的状态返回值;
   与此前的一个命令是否成功执行相关的返回内容;
bash使用一个特殊的内置变量来保存其内容:$?
$?:实际上保存的是一个数值,其取值范围:0-255
其中:0:表示命令执行成功  1-255:表示命令执行失败
1,2,127:是bash中内置的命令执行失败的状态返回值
1:表示小问题
2:表示严重问题
127:表示命令本身出现的问题
其它数字:表示用户可以自定义的失败状态返回值



七、引用功能
 ``:强引用
凡是被单引号引用的内容,bash在处理时,一律视其为普通字符,即使其本身是bash定义的具有特殊功能和作用字符亦是如此,但单引号本身除外;
 “”:弱引用
 被双引号所引用的内容中,有些特殊字符仍然会保留其特殊含义,如:$,\其他的都视为普通字符。



八、转义功能
\:bash所定义的转义字符,大多数情况下\只能将其后面一个字符转义;
\COMMAND:取消定义过的命令别名,而使用其本身的功能;


九、Globbing---文件名通配符,简称为glob;
*:匹配任意长度的任意字符或字符串;(某些特殊位置的 . 字符不能匹配)
?:匹配任意的单个字符;(某些特殊位置的 . 字符不能匹配)
[ ]:匹配指定范围内的任意单个字符,必须匹配且只能匹配一个字符;
指定范围的方法:
1.枚举法:列出所有有效字符
2.范围指令:
[0-9]:表示所有的单个的十进制数字;
[a-z]:a,A,b,B,......y,Y,z   不包括Z
[A-Z]:A,B,b,......y,Y,z,Z   不包括a
3.bash内建字符集:
 [:lower:]:所有的小写字母
 [:upper:]:所有的大写字母
 [:alpha:]:所有字母,包括大小写
 [:digit:]:所有单个的十进制数字
 [:alnum:]:所有的字母和十进制数字
 [:punct:]:所有的符号
 [:space:]:表示空白字符,包括空格和制表符;
4.反向匹配
 ^:取反,^a表示除了a之外其他字符;

注意:当 中括号 中有 托字符 表示字符集取反向匹配是,要注意 * 的使用,因为 * 的通配范围可能会导致反向匹配失败;此类失败是因为bash的globbing是在贪婪模式下匹配的;



十、管道
 | 管道符号通常是用来连接多个命令的:将管道符号前面的命令的执行的输出结果通过管道传递给管道符号后面的命令,让后面的命令将前面的命令的输出结果当作参数使用;


wc命令
输出文件中的行数、单词数、字节数
格式: wc [选项列表]... [文件名列表]...
 -c, --bytes, :仅显示文件中的字节数
 -m, --chars:仅显示文件中有效字符的数量
 -l, --lines:仅显示文件的行数
 -w, --words:仅显示文件中字的数量

注意:
1.一般来讲,凡是被管道连接的命令,都应该能够在执行成功之后完成命令结果的输出,否则管道无意义;
2.管道不是万能的,有些场合没办法是用管道;


十一、输入输出重定向
在使用计算机的时候,实现某个功能的主体是程序!
程序=指令+数据


数据至关重要!

文件:IO---输入和输出(input/output)

在linu系统中,能够完成输入和输出功能的实体:文件

可以用于输入的设备:文件
键盘设备、文件系统中的常规文件、网卡设备、声卡设备、磁盘设备等;

可以用于输出的设备:文件
显示器、文件系统中的常规文件、网卡设备、声卡设备、磁盘设备等;

在内存中使用文件的方式是定义文件描述符,一个文件描述符就对应一个文件;
  0:表示标准输入,记为 stdin,从键盘实现的输入数据流
  1:表示标准输出,记为stdout,到显示器的输出数据流
  2:表示标准错误,记为stderr,到显示器的错误数据流

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




输入重定向:
 < :
输出重定向:
 >:覆盖输出重定向
~]# set -C :开启防止意外覆盖原文件开关,可以使用 >| 来完成覆盖重定向输出,而无需关心是否开启此开关;
~]# set +C :关闭防止意外覆盖原文件开关
 >>:追加输出重定向


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



合并标准输出和标准错误的重定向:
 1.COMMAND{>|>>} /PATH/TO/SOMEFILE 2>&1
 2.&>(覆盖),&>>(追加)

特殊的设备文件:/dev/null: biackhole,bitbucket(位桶)----相当于回收站
                /dev/zero:泡泡机,吐零机




bash中的其他特殊符号:
<<:here document   ,此处文档,结束标记;
<<<:here string  ,此处字符串,结束标记;