运维学习第四弹之shell(bash):

一、

    hell可以翻译成壳,大多指能够对内部核心起到保护作用的一种装置或结构。在计算机科学中shell的实际意义为操作者提供的、能够通过系统调用或库调用使用整个计算机资源的访问接口。

    它既是一种命令解析器又是一种程序设计语言。作为命令解析器,它可以解释和执行用户输入的命令,也可以自动地解释和执行预先编写好并保存在某个文本文件中的一系列的命令;作为程序设计语言,shell特别定义了各种变量和参数,并提供了许多在高级语言中才具有的控制结构,包括循环和条件分支,让我们可以像使用高级语言那样去使用shell,使之能够胜任复杂逻辑环境的应用,提高其执行效率,更容易发挥其自动化的特性

shell分为交互式shell和非交互式shell:

 1)交互式shell:在这种模式下,shell等待你的输入,并且执行你提交的命令。这种模式被称作交互式是因为shell与用户进行交互。这种模式也是大多数用户非常熟悉的:登录、执行一些命令、注销登录。当你注销登录后,shell将终止运行。

 2)非交互式shell;在这种模式下,shell等待你的输入,并且执行你提交的命令。这种模式被称作交互式是因为shell与用户进行交互。这种模式也是大多数用户非常熟悉的:登录、执行一些命令、注销登录。当你注销登录后,shell将终止运行。

  这里我们可以使用cat /etc/shells来查看shell的类型。

 这里我们终点学习基本的shell ——bash

bash:bash是大多数Linux系统以及Mac OS X默认的shell,它能运行于大多数Unix类操作系统之上,甚至被移植到了Microsoft Windows上的Cygwin系统中,以实现Windows的POSIX虚拟接口。

  二、bash命令:

 1)、alias命令:命令的别名,用于自定义命令

  例、alias mp=‘mkdir -pv’

  撤销别名:unalias unaliasNAME

  注意:

  1.alias命令的效郭仅限于当前shell的生命周期

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

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

 另外,对于每一个用户来说,都有一个私有的bash配置文件,用于保存别名 ~/.bashrc


 2)历史命令:

   BASH进程会帮助用户保存曾经执行的命令,以方便用户重复执行某个命令;

   通过bash提供的历史命令文件来保持此前执行过的命令,每个用户都有其自己私有的历史文件

   登录shell的时候,BASH会自动读取~/.bash_history文件中的所记录的所有命令;

history命令:

      -c清空历史缓冲区中的历史命令

      -d 偏移量从指定位置删除历史列表。

      -a将当前绘画的历史行追加到历史文件中

      -n从历史文件中读取所有未被读取的行

      -r读取历史文件并将内容追加到历史列表中

      -w将当前历史写入到历史文件中,并追加到历史列表中

      -p对每一个 ARG 参数展开历史并显示结guo而不存储到历史列表中

      -s以单条记录追加 ARG 到历史列表中

  重复执行前一个命令的方法:

     1使用箭头

     2.ctrl+p

     3.!-1

     4.!!

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

    ! #:重复执行编号为#的命令

    ! 字符串:查找第一个以字符串开头的并重复执行

    !?+字符串:从历史缓冲区中查找最近一次包含字符的命令并重复执行

    !-#:执行历史缓冲区中倒数第#条命令

   ctrl+r:在历史缓冲区中实施搜素,回车执行即可

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

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

  esc, . 

   Alt+.:

   !^:上一个命令中的第一个位置的参数

   !:2:上一个命令中的第2个未位置的参数

  !SEQUENCE;#:表示

  与历史相关的bash变量:

  HISTSIze: 2

  HISTSIESIZE:

  HISTTIMEFORMAT

  HISTCONTROL:什么命令记录什么不记录

  清空历史命令:

  ignoredups:忽略连续且相同的命令的历史缓存:

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

  ignoreboth:以上两个功能都启用;

history 命令在bash中是一项很重要的命令,对于初学者来说,对于命令的基本操作还不是很容易,这个命令可以很好的帮助我们查看并重复以前的操作。


三、快捷键:键盘映射

         c-->ctrl

         M-->Alt

         E-->ESC

         DEL-->Backspace

        

        c-l:clear,清屏

        C-a:将光标移至命令的行首

        c-e:将光标跳转至命令的行尾

        c-k:删除光标所在位置到行尾的命令行信息

        c-u:删除光标所在位置到行首的命令行信息

        C-c:取消当前命令的进程


四、命令补全机制:

        命令本身字符串的补全

        参数的补全

shell命令的执行过程:

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

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

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

4.判断选项是否正确,判断参数是否正确;


使用TAB键完成命令补全:

荣国给出的字符串不能作为唯一标识,则bash不予补全;再次敲击tab键,bash会给出参数列表。;如果参数列表中的内容过多,bash会查询是否显示该列表


根据提供的参数来进行补全,如果参数没有任何提示信息则默认从工作目录进行查找


五、命令行的展开:

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

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

  ~+:调用shell变量“PWD”的值

  ~+:调用shell变量“OLDPWD"的值;

  {}:在花括号中可以填充一个以”,“分隔的路径列表,bash会将其展开为多个独立的路径;类似于乘法结合律

  例如:mkdir -pv /tmp/{a,b}_{c,d}


wc命令:wc命令用来打印文件的文本行数、单词数、字节数等 

  -c:只显示字节数

  -l:只显示行数

  -w:只显示字数


六、命令的执行结果

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

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

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

        ``:反向单引号,反引号echo "I am `whoami`"

         I am root

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

       

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

         跟命令执行成功与否相关的返回内容

             保存在bash的一个特殊变量中;$?

     0:表示命令执行成功

     1,2,127:表示内置状态返回值

        1:表示小问题

        2:严重问题

        127:命令本身出问题

       3-126,128-255:用户自定义状态信息;


引用功能:

‘’:强引用

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

"":弱引用

被双引号引用的内容中,有些特殊字符仍然会保留其特殊含义,参数本身需要空格,最好加引号

例如:

  [root@localhost ~]# echo "I am `whoami`"

  I am root

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

  $PATH

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

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


  [root@localhost ~]# date

  2017年 03月 19日 星期日 10:59:48 CST

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

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

  Try 'date --help' for more information.

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

  2017-03-19 11:00:21


转义功能:

\:bash中定义的转义字符;只能使其其后的一个字符有作用,使其后的字符失去作用,或者实现本身的意义


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

元字符:通配符

    *:匹配任意长度的任意字符,某些特殊位置的“.”不能被匹配

   ?:匹配任意单个字符,

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


字符集:

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

   [:lower:]]:所有小写的单个字符

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

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

   [:digit:]:表示所有的十进制数字

   [:alnum:]:表示所有的大小写字母以及十进制数字

   [:space:]:表示所有的空白字符

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

   ^:取反匹配

   例:ls -d /etc/[^[:alpha:]][[:alpha:]]*

   目录下,以非字母开头,且其后跟了 一个字母以及其他任意字符的文件名


十、

 

输入输出重定向

     在使用计算机时实现某种x功能的主题是:程序:指令+数据

数据:文件,IO

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

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

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

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

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

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

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

错误数据流;将程序无法处理或处理过程中出现问题的结果展示给用户的数据流;

默认的错误数据流的终点是显示器;

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

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

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


文件描述符:File Descriptor,FD    为什么?

十六位二进制

    0:标准输入,stdin

    1:标准输出,stdout

    2:标准错误,stderr

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


输出重定向:

ls > /tmp/ls.out  人为地将ls命令显示到目标文件中

cat /tmp/ls.out 显示文件输出

>:覆盖(替换)输出重定向:将源文件内的内容全部替换。


~]# set -C //开启防误覆盖开关

     在开启次开关后,可以使用“>|”符号继续覆盖重定向

例:ifconfig >| /tmp/ifconfig.out  可以在开关开启的情况下实施文件的覆盖。


~]# set +C //关闭防误覆盖开关

>>:追加输出重定向:在原有的文件内容下追加信息。

可以用输出重定向创建一个新的文件:例:> nullfile ,>> nullfile

但是对于新的不存在的文件来说 >,>>  是一样的,但是对于以前不存在的文件来说是不一样的,在操作是一定要注意安全。 

错误重定向:

2(标准错误) >:覆盖错误重定向

例:lss 2> /tmp/lss.out 将原来要输出到2中的错误数据流信息重定向到指定文件内 

2 >>:追加错误重定向

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

 1)  &>:覆盖

      &>>追加

 2)COMMAND >|(或者)>> /PATH/TO/SOMEFILE 2>&1 


****/dev/null:BlackHole, BitBucket(位桶)

 ls /tmp/a.txt &> /dev/null:只用于判断命令是否正确

 ls /tmp/a.txt > /dev/null 2>&1


  输入重定向:

<:唯一的输入重定向符号

有的命令是不支持文件做参数的:tr

tr ‘abc’'ABC' < /etc/issue

wc:命令加<(纯数字的结果)与不加<是两种结果

<<:是无意义的符号 但对shell来说有用。Here Document()此处文档

例 wc << /etc/inittab

cat > /tmp/cat.out << EOF(至此字符结束执行命令)用来文件的创建并且编辑内容。

<<<:此处字符串eof

例:tr 'a-z''A-Z' <<< eof

/ETC/FSTAB 

tr 'a-z''A-Z' << eof

hello

hi 

i am so good

eof

HELLO

HI

I AM SO GOOD

十一、管道:都是有标准输出的命令

1:

  COMMAND1|COMMAND2|COMMAND3|....

head -n 9 /etc/passwd | tail -n 1  (取出第九行)

注意:所有的用于管道连接的命令,都应该是能够有标准输出数据流的命令;


tee: T  

[root@localhost ~]# echo hahaha

hahaha

[root@localhost ~]# echo hahaha | tee /etc/passwd

hahaha

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

学好管道的运用,可以大大的提高我们早工作时的效率和效果。