SHELL

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

上世纪的70年代中期在贝尔实验室,BourneUnix开发了一个shell程序Bourne Shell,简称sh

 

Bill Joy:用C语言根据sh重新编写 C Shell,简称csh;躺床上为其衍生版;

 

David Korn:集合cshhesh的优点研发的Korn Shell,简称ksh

 

GNUGNU组织发现sh是比较好用的又进一步开发Borne Again Shell,简称bashLinux系统中默认的shell程序;

 

zsh:最终Shell,功能非常强大;(但是在linux中并没有更换)

当前系统中所有可以支持的安全的shell

 /etc/shells

注意:

1. 除了/sbin/nologin之外,其他的shell都可以用来测试使用;

2. 在更换shell时,最好在bash中更换其他shell,如果已经换成了其他shell就使用exit命令返回至bash,再行切换;

3. 选择shell

  [root@localhost ~]# cat /etc/shells

  /bin/sh

  /bin/bash

  /sbin/nologin

  /usr/bin/sh

  /usr/bin/bash

  /usr/sbin/nologin

  /bin/tcsh

  /bin/csh

  [root@localhost ~]# echo $0

  bash

  [root@localhost ~]# tcsh

  [root@localhost ~]# echo $0

  tcsh

  切换为原来的shell

  [root@localhost ~]# exit

  exit

  [root@localhost ~]# echo $0

  bash

bash的特性:

 一、命令的别名——(自定义命令)

   alias-定义或显示别名

   格式:alias [-p] [名称[=] ... ]

   如果alias命令不带任何选项或参数,则表示显示所有已经定义并生效的别名设置;

   #alias ALIAS=COMMAND [OPTION][ARGUMENT]

 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

  MAlt

  EEsc

  DELBackspace

 

 C-l:清屏,相当于clear命令;

 C-a:将光标跳转至命令行编辑模式的行首

 C-e:将光标跳转至命令行编辑模式的行尾

 C-k:当前光标位置删除至行尾

 C-u:当前光标位置删除至行首

 C-c:结束前台进程

 M-.:引用上一个命令中的最后一个参数;(载Xshell中不能用)

 E按一次再按.:功能同上一个M-.可以在Xshell中使用

三、命令历史:

 bash进程会保存其会话中的用户曾经执行过的命令,以方便用户重复执行某个命令;命令历史包括两个各方面:

  1.用户曾经执行过的命令;

  2.用户层执行过的命令的路径;

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

命令如何被shell执行的?

 bash会将命令行的内容按照空白字符进行切片,分析第一个切片内容;

  1.判断第一个切片的内容是内部命令还是外部命令;

如果是内部命令,直接运行;

  如果是外部命令,先找hash表中的路径缓存,如果有则直接执行;否则,则需要通过查找PATH变量中包含路径中,是否有对应名称的文件;

  使用hash命令查看被记住的命令文件的路径;

   -r:清空hash

  使用history命令来显示曾经执行过的命令参数;

   hietory-显示和操纵历史列表

   格式:history [-c] [-d 偏移量] [n] 或 

                      history -anrw [文件名] history -ps 参数 [参数...]

   常用选项:

-c:清空历史缓冲区中的命令历史纪录;

-d OFFSET:删除指定的历史命令条目;

重复执行历史缓冲区的命令:

“!编号” :直接调用历史缓冲区中此编号命令;

“!STRING” :重复执行历史缓冲区中以STRING开头的最后一次执行过的命令;

!?STRING :重复执行历史缓冲区中包含了“STRING”的最后一次执行过的命令;

    -编号    :直接调用历史缓冲区中此编号命令;

使用上下箭头也可调用历史缓冲区命令回车执行;

C-r :在历史缓冲区中实施搜索,回车之后执行;

    $ :在历史缓冲区中调用最后一个命令的最后一个参数;

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

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

SEQUENCENUMBER :历史缓冲区中调用第“SEQENCE”条命令中第NUMBE位置                          的参数;

 

bash中与命令相关的内置变量:(变量名称大小写敏感不能打错)

  HISTSIZE:历史缓冲区中能够保存的命令历史的最大条目数量:默认是1000

  HISIFILESIZE:~/.bash_history文件中能够保存的命令历史的最大条目数量:默认是1000

  HISTIMEFOMAT:在命令历史缓冲区中记录历史命令时,同时记录命令的执行的时间戳标记:可以使用date命令的FORMAT来表示时间的记录格式:默认值为空;

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

ignoredups:忽略连续切向同行的命令被记录到历史缓冲区,此为默认值;

ignotrspace:以空白字符开头的命令不会被记录到历史缓冲区;

Ignoreboth:上述两种情况都不会被记录到历史缓冲区;

四、命令补全——(TAB键的使用)

 包括两个发面的内容:

  1.构成命令字符串的补全;

参考PATH变量中的路径,对命令进行补全;

  如果,给出的字符串在PATH变量对应的路径中是唯一的,则直接补全命令;

  如果,给出的字符串在PATH变量对应的路径中是不是唯一的,则bash给出提示;

 

  2.命令中参数所对应的字符串补全

   根据给出的路径进行补全:

     如果,给出的字符串在给出的路径中是唯一的,则直接补全命令;

     如果,给出的字符串在给出的路径中是不是唯一的,则bash给出提示;

五、命令行展开

 1.~展开:

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

  ~STRINGbash会将其自动展开为以“STRING”为用户名的用户的家目录;

  ~+:调用bash的内置变量“PWD”的值;

  ~-:调用bash的内置变量“OLDPWD”的值;

 2.{}展开:

  {}中,可以填充一个以“,”(英文输入法中的“,”)分隔的路径列表,bash会将其展开为多个独立路径;

两种应用

[root@localhost ~]# mkdir -pv /china/{hb,hn,qd,bj}/{1,2,3}/class18

mkdir: 已创建目录 "/china"

mkdir: 已创建目录 "/china/hb"

mkdir: 已创建目录 "/china/hb/1"

mkdir: 已创建目录 "/china/hb/1/class18"

mkdir: 已创建目录 "/china/hb/2"

mkdir: 已创建目录 "/china/hb/2/class18"

mkdir: 已创建目录 "/china/hb/3"

mkdir: 已创建目录 "/china/hb/3/class18"

mkdir: 已创建目录 "/china/hn"

mkdir: 已创建目录 "/china/hn/1"

mkdir: 已创建目录 "/china/hn/1/class18"

mkdir: 已创建目录 "/china/hn/2"

mkdir: 已创建目录 "/china/hn/2/class18"

mkdir: 已创建目录 "/china/hn/3"

mkdir: 已创建目录 "/china/hn/3/class18"

mkdir: 已创建目录 "/china/qd"

mkdir: 已创建目录 "/china/qd/1"

mkdir: 已创建目录 "/china/qd/1/class18"

mkdir: 已创建目录 "/china/qd/2"

mkdir: 已创建目录 "/china/qd/2/class18"

mkdir: 已创建目录 "/china/qd/3"

mkdir: 已创建目录 "/china/qd/3/class18"

mkdir: 已创建目录 "/china/bj"

mkdir: 已创建目录 "/china/bj/1"

mkdir: 已创建目录 "/china/bj/1/class18"

mkdir: 已创建目录 "/china/bj/2"

mkdir: 已创建目录 "/china/bj/2/class18"

mkdir: 已创建目录 "/china/bj/3"

mkdir: 已创建目录 "/china/bj/3/class18"

常用作同时创建多个目录

[sola@localhost ~]$ ls

c.txt  下载  公共的  图片  文档  桌面  模板  视频  音乐

[sola@localhost ~]$ cp c.txt{,.bak}

[sola@localhost ~]$ ls

c.txt  c.txt.bak  下载  公共的  图片  文档  桌面  模板  视频  音乐

 

六、命令的执行结果

bash中,命令的执行结果有两种:

 1.执行命令的输出结果:

   根据用户需求获取到的命令执行的正常输出结果;

   命令引用或命令替换:

   ``(波浪线键使用英文输入法)相当于$()

   ``:反向单引号,反引号

  示例:

  [root@localhost ~]# ls

  123  abc  anaconda-ks.cfg  a.txt  b.txt  initial-setup-ks.cfg  公共  模   板  视频  图片  文档  下载  音乐  桌面

  [root@localhost ~]# touch a.txt-$(date +%F-%H-%M-%S)

  [root@localhost ~]# ls

  123  abc  anaconda-ks.cfg  a.txt  a.txt-2017-10-21-14-40-46  b.txt       initial-setup-ks.cfg  公共  模板  视频  图片  文档  下载  音乐  桌面

  [root@localhost ~]# touch a.txt-`date +%F-%H-%M-%S`

  [root@localhost ~]# ls

  123  abc  anaconda-ks.cfg  a.txt  a.txt-2017-10-21-14-40-46  a.txt-       2017-10-21-14-41-48  b.txt  initial-setup-ks.cfg  公共  模板  视频  图片   文档  下载  音乐  桌面

此操作常用于文件的备份时标记备份时间

 2.执行命令的状态返回值:

 与此前的一个命令是否成功执行相关的返回内容;

  Bash使用一个特殊的内置变量来保存其内容:$?

   $?实际上保存的是一个数值,其取值范围:0~255

  其中

   0:表示命令执行成功;

   1~255:表示命令执行失败

   12127bash中内置的命令执行失败的状态返回值;

1:表示一些小问题

2:表示严重的问题

127:表示命令本事出现问题;

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

七、引用功能:

   ‘’ :强引用

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

  “”:弱引用

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

例如:

[root@localhost ~]# date +%F +%T

date: 额外的操作数 "+%T"

Try 'date --help' for more information.

[root@localhost ~]# date +"%F %T"

2017-10-21 15:25:19

[root@localhost ~]# date +'%F %T'

2017-10-21 15:25:43

八、转义功能

  \bash定义的转义字符:大多数情况下,“\”只能将其后面一个字符转义;

例如:[root@localhost ~]# echo \$PATH

$PATH

[root@localhost ~]# echo \$$PATH

$/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin

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

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

 *:匹配任意长度的任意字符或字符串;(某些特殊位置的“.”是不能匹配的)

 ?:匹配任意单个字符;(某些特殊位置的.”是不能匹配的)

 []:匹配任意指定范围内的人以单个字符,必须匹配且只能匹配一个字符;

  指定范围的方法:

   1.枚举法:列出所有有效字符;

   2.范围指定:

[0-9]:表示所有单个的十进制数字;

[a-z]aAbB……yYz(不包含Z

[A-Z]ABbC……yYZz(不包含a

   3.bash内建字符集:

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

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

     [:alpha:]:所有字母包括大小写

     [:digit:]:所有的单个十进制数字

     [:alnum:]:所有的字母和十进制数字

     [:punct:]: 所有的符号

     [:space:]:表示空白字符,包括空格和制表符

   4.反向匹配:

     ^

     示例:

       #ls a[^[:digit:]]?? //表示文件名的第二个字符不能是十进制数字;

      注意:当中括号中有^表示字符集反向匹配时,注意*的使用;因为通配范围可能会导致反向匹配失败;

此类失败是因为bashglobbing是在贪婪模式下匹配的;

十、管道

 |

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

 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——输入输出

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

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

   键盘设备、文件系统中的常规文件、网卡设备、声卡设备等

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

   显示器、文件系统中的常规文件、网卡设备、声卡设备、磁盘设备等;

 在内存中使用文件的方法是定义文件描述符,一个文件描述符就对应一个文件;

  0:表示标注输入,stdin,从键盘实现的输入数据流;

  1:表示标注输出,stdout,到显示器的输出数据流;

  2:表示标准错误,stderr,到显示器上的错误数据流;

 输入输出重定向(IO重定向)

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

  输入重定向:

<(很多情况下可以省略)

  输出重定向:

> :覆盖输出重定向

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

~]# set -C   //关闭防止意外覆盖源文件开关

>>:追加输出重定向

  错误重定向:

   2> :覆盖错误重定向

   2>>:追加错误重定向

   和并标注输出和标准错误的重定向:

    1.COMMAND{>|>>} /PATH/TO/SOMEFILE 2>&1

    2.&>&>>

  特殊的设备文件:

   /dev/nullBlackHoleBitBucket(位桶)

   /dev/zero:泡泡机,吐零机;

  bash中的其他特殊符号:

   <<:here document ,此处文档结束标记;(很常用)

   <<<:here string,此处字符串,结束标记;