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,再行切换;
Bash的特性:
一、命令的别名——(自定义命令)
	alias
		alias - 定义或显示别名。
		格式:alias [-p] [名称[=值]...]
		注意:如果alias命令不带任何选项和参数,则表示显示所有已经定义并生效的别名设置;

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

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

	对于每个用户来说,都有一个私有的bash的配置文件,就在用户的家目录中的一个隐藏文件,文件名为".bashrc",其主要功能就是用来保存命令的别名的定义;

		注意:
			在对于此文件中的命令别名进行编辑并保存之后,在当前已经运行的bash中并不会立即生效,需要重新加载此文件才能使配置生效,以下两种操作皆可实现:
				1.重启bash:注销之后再次登录即可;
				2.执行文件中定义的命令:使用source命令,或者.命令;

				source/.
				source - 在当前 shell 中执行一个文件中的命令。
				. - 在当前 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,.:功能同M-.

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

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

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

				使用hash命令查看被记住的命令文件的路径;
					-r:清空hash表;

				使用history命令查看被记住的命令的命令行参数;
					history - 显示或操纵历史列表。
					格式: history [-c] [-d 偏移量] [n] 或 history -anrw [文件名] 或 history -ps 参数 [参数...]

						常用选项:
							-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给出提示;

五、命令行展开
	(a+b+c)(d+e+f)=ad+ae+af+bd+be+bf+cd+ce+cf
	1.~展开:
		~:bash会自动将其展开为当前登录用户的家目录;
		~STRING:bash会自动将其展开为以"STRING"为用户名的用户的家目录;

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

	2.{}展开:
		在"{}"中,可以填充一个以","分隔的路径列表,bash会将其展开为多个独立的路径;
		示例:
			~]# mkdir -pv /china/{hb,hn,jl,hlj,ln}/{link,linka,linkb}/class18

			~]# cp 1.txt{,.bak}
				1.txt{,.bak} == 1.txt 1.txt.bak

六、命令的执行结果
	在bash中,命令的执行结果有两种:
		1.执行命令的输出结果:
			根据用户的需求获取到的命令执行的正常输出结果;
			命令引用或命令替换:

			``  相当于	$()
			``:反向单引号,反引号;

			示例:
				创建一个文件,文件名为test-系统时间;
				~]# touch test-`date +%F-%H-%M-%S`

		2.执行命令的状态返回值:
			与此前的一个命令是否成功执行相关的返回内容;
			bash使用一个特殊的内置变量来保存其内容:$?
				$?实际上保存的是一个数值,其取值范围:0-255

				其中:
					0:表示命令执行成功;
					1-255:表示命令执行失败;
						1,2,127:bash中内置的命令执行失败的状态返回值;
							1:表示小问题;
							2:表示严重问题;
							127:表示命令本身出现问题;

							其余数字(3-126,128-255):用户可以自定义的失败状态返回值;

七、引用功能:
	'':强引用
		凡是被单引号引用的内容,bash在处理时,一律视其为普通字符,即使其本身是bash定义的具有特殊功能和作用字符亦是如此,但单引号本身除外;

	"":弱引用
		被双引号引用的内容中,有些特殊字符仍然会保留其特殊含义,如: $, \, "";

八、转义功能:
	\:bash定义的转义字符;大多数的情况下,  " / "只能将其后面一个字符转义;

	\COMMAND:取消定义过的命令别名,而使用命令本身的功能;

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

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

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

	wc:
		wc - print newline, word, and byte counts for each file
		格式:wc [OPTION]... [FILE]...
			常用选项:
				-c, --bytes:仅显示文件中的字节数;
				-m, --chars:仅显示文件中的有效字符的数量;
				-l, --lines:仅显示文件的行数;
				-w, --words:仅显示文件中字的数量;

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

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

	程序=指令 + 数据

	数据至关重要!

	文件,IO——Input/Output

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

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

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

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

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

		输入重定向:
			<

		输出重定向:
			>:覆盖输出重定向;
				~]#  set -C  //开启防止意外覆盖源文件开关,可以使用">|"符号完成覆盖重定向输出的操作,而无需关心是否开启此开关;
				~]# set +C  //关闭防止意外覆盖源文件开关
			>>:追加输出重定向;

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

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

		特殊的设备文件:
			/dev/null:BlackHole,BitBucket(位桶) 
			/dev/zero:泡泡机,吐零机;

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