一 、为何要学习 shell

Shell 脚本语言是Linux/UNIX系统上一种重要的脚本语言,在Linux/UNIX领域应用极为广泛,熟练掌握Shell脚本语言是一个优秀的Linux/UNIX开发者和系统管理员的必经之路。利用Shell 脚本语言可以简洁地实现复杂的操作,而且Shell 脚本程序往往可以在不同版本的Linux/UNIX系统上通用。

脚本语言的灵活性是以执行效率为代价的,脚本语言的执行效率通常不如编译型语言。当然,脚本语言一般不适用于大型的项目、计算复杂的工程或有高级需求的应用软件,它适用于系统管理、文本处理等方面完成特定功能的常用的小工具或小程序。

二 、什么是shell

shell就是系统跟计算机硬件交互时使用的中间介质,它只是系统的一个工具实际上,在shell和计算机硬件之间还有一层东西那就是系统内核了打个比方,如果把计算机硬件比作一个人的躯体,而系统内核则是人的大脑,至于shell,把它比作人的五官似乎更加贴切些回到计算机上来,用户直接面对的不是计算机硬件而是shell,用户把指令告诉shell,然后shell再传输给系统内核,接着内核再去支配计算机硬件去执行各种操作

在计算机科学中,Shell俗称壳(用来区别于核),是指“提供使用者使用界面”的软件(命令解析器)。它类似于DOS下的command和后来的cmd.exe。它接收用户命令,然后调用相应的应用程序。同时它又是一种程序设计语言。作为命令语言,它交互式解释和执行用户输入的命令或者自动地解释和执行预先设定好的一连串的命令;作为程序设计语言,它定义了各种变量和参数,并提供了许多在高级语言中才具有的控制结构,包括循环和分支。

shell的分类

基本上shell分两大类:

1 图形界面shell

 应用最为广泛的 Windows Explorer 微软windows系列制作系统),还有也包括广为人知的 Linux shell,其中linux shell 包括 X window manger (BlackBoxFluxBox),以及功能更强大的CDEGNOMEKDEXFCE

2 命令行式shell

 传统意义上的shell指的是命令行式的shell,以后如果不特别注明,shell是指命令行式的shell

 文字操作系统与外部最主要的接口就叫做shellshell操作系统最外面的一层。shell管理你与操作系统之间的交互:等待你输入,向操作系统解释你的输入,并且处理各种各样的操作系统的输出结果。shell提供了你与操作系统之间通讯的方式。

3 交互式shell和非交互式shell

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

 shell也可以运行在另外一种模式:非交互式模式。在这种模式下,shell不与你进行交互,而是读取存放在文件中的命令,并且执行它们。当它读到文件的结尾,shell也就终止了。

4 shell的类型

Bourne shell (包括 sh,ksh,and bash)

Bourne shell ( sh)  ,Korn shell ( ksh)

Bourne Again shell ( bash)POSIX shell ( sh)

C shell (包括 csh and tcsh)C shell ( csh)

TENEX/TOPS C shell ( tcsh)

如下我们查看有哪些shell可用

Linux  shell之初入门_shell编程


四 、bash shell 的功能及特点

  1 、命令记忆能力(history

   保存用户曾经执行过的命令操作linux系统中存放位置:~/.bash_history 文件

   a 查看历史命令 history

Linux  shell之初入门_Linux_02

   b 调用历史命令

   c !n:执行历史记录中的第n条命令

   d !str:执行历史记录中以“str”开头的命令

   e 设置记录历史命令的条数 /etc/profile

       修改 HISTSIZE 参数(默认为1000条)

   f history -c 为清空  ~/.bash_history中的记录

  2 指令和文件名补全

   按tab键,它可以帮你补全一个指令,也可以帮你补全一个路径或者一个文件名连续按两次tab键,系统则会把所有的指令或者文件名都列出来

Linux  shell之初入门_Linux_03

  3 、命令别名的设置

         alias把一个常用的并且很长的指令别名一个简洁易记的指令如果不想用了,还可以用unalias解除别名功能直接敲alias会看到目前系统预设的alias alias 别名 =“正常命令”

Linux  shell之初入门_Linux_04


  4 、作业控制,前台、后台控制

   当运行一个进程时,你可以使它暂停(按Ctrl+z),然后使用fg命令恢复它,利用bg命令使他到后台运行,你也可以使它终止(按Ctrl+c

  5 、通配符

  *:任意长度的任意字符

Linux  shell之初入门_shell编程_05

  ?: 任意单个字符

  []:指定范围内的任意字符;[a-z]

  [0-9]:所有数字,[a-z]:所有小写字母,[A-Z]:所有大写字母

  [a-zA-Z]所有字母

  [^]:脱字符,取反,指定范围外的任意单个字符,[^0-9]

  [^0-9][^0-9]

  6 、输入输出重定向

输入重定向用于改变命令的输入,输出重定向用于改变命令的输出输出重定向更为常用,它经常用于将命令的结果输入到文件中,而不是屏幕上输入重定向的命令是<,输出重定向的命令是>,另外还有错误重定向2>,以及追加重定向>>

Linux  shell之初入门_Linux_06


  7 管道符

管道符|就是把前面的命令运行的结果丢给后面的命令

Linux  shell之初入门_shell编程_07


、bash 的变量

  1 、bash变量类型;

     本地变量:只对当前shell进程有效

     局部变量:local VAR_NAME-Value

     环境变量:export VAR_NAME=Value,对当前shell及其子shell有效

     位置变量; $1,$2...

     特殊变量; $$,$!,$#,$?

  2 、变量的定义与显示及其引用

     定义变量:

     [set] VAR_NAME=Value set可省略)

     变量显示 :echo

     引用变量

      ${VAR_NAME}

Linux  shell之初入门_shell编程_08


  3 、变量的设置及其设置规则

  变量与变量的内容以一个等号“=”来连接,等号两边不能直接使用空格符

  变量内容若有空格符可以使用双引号“”或是单引号‘’将变量内容结合起来,但是双引号内的特殊字符如$可以保持原本的特性,单引号的特殊字符则仅为一般字符(纯文本)。

Linux  shell之初入门_shell编程_09

  4 、取消变量的方法

   为使用“unset 变量名称”例如取消“NAME”的设置

  “unset NAME

  5 、变量的命名风格

    a:只能包含字母、数字和下划线

    b:不能以数字开头

    c:严格区分大小写

    d:要做到见名知义

    e:命名规范,风格统一

系统环境变量与个人环境变量的配置文件

  1 bash的环境变量

  使用envenvironment)查看环境变量与常见环境变量的说明,当然使用export也会查看到同样的内容。

Linux  shell之初入门_Linux_10

  2 、环境变量的功能

PATH 决定了shell将到哪些目录中寻找命令或程序

HOME 当前用户主目录

Linux  shell之初入门_Linux_11

HISTSIZE 历史记录数

LOGNAME 当前用户的登录名

HOSTNAME 指主机的名称

SHELL 前用户Shell类型

LANG 语言相关的环境变量,多语言可以修改此环境变量

MAIL 当前用户的邮件存放目录

PWD 当前目录

Linux  shell之初入门_Linux_12

  3 bash的配置文件

(1) profile类:交互式登录用户

  文件:/etc/profile:全局,对所有用户有效

/etc/profile.d/*.sh:全局,对所有用户有效

~/.bash_profile:仅对某用户自己有效

  功能:设定环境变量;运行命令或脚本

2)、 bashrc类:非交互式登录用户

  文件: /etc/bashrc:全局有效

~/.bashrc:仅对某用户自己有效

  功能: 设定环境变量; 定义命令别名;

  4 在配置文件更新后,新的定义不会立即生效,要想生效,

  有两种方式:

  a,重新登录;

  bsource FILE

bash常用的基础命令的应用

1 、数据流的重定向

      将默认数据流改为其他设备,就称为IO重定向

     a 输出重定向:

      >,覆盖重定向;set -C关闭覆盖,避免覆盖                                                                                                    

      set +C 关闭上述功能,强制覆盖:>|

      >>,追加重定向

      /dev/null;数据黑洞,bit bucket

     b 错误输出重定向:

       2>;覆盖重定向

      2>>: 追加重定向

     c 同时重定标准输出和错误输出

     COMMAND >/path/to/stdout  2> /path/to/error

 标准输出和错误输出定向至一个文件

     &>  ,&>>

     COMMAND &> /path/to/somewhere

     COMMAND  > /path/to/somewhere 2>&1

     d 输入重定向:

    <:COMMAND < /from/somewhere

   <<: Here Document ,此处创建文档

  2 、管道

    管道: shell COMMAND1 |

    程序:读入数据,执行结果输出

    cat 重定向:输入重定向,输出重定向

    stdin :Standard Input  (标准输入,默认输出)

    stdout; Standard output (标准输出,默认输出)

  3 、选取命令 grep cut

 对于grep上期《Linux  grep命令的使用及正则表达式》中详细介绍过,       我们来看看cut命令的使用

语法:cut -d 分隔字符[-cf] n 这里的n是数字

        -d :后面跟分隔字符,分隔字符要用双引号括起来

        -c :后面接的是第几个字符

        -f :后面接的是第几个区块

Linux  shell之初入门_shell编程_13

  4 、sort:用做排序

   语法:sort [-t 分隔符] [-kn1,n2] [-nru] 这里的n1 < n2

        -t 分隔符:作用跟cut-d一个意思

        -n :使用纯数字排序

        -r :反向排序

        -u :去重复

Linux  shell之初入门_Linux_14

  5 、wc:统计文档的行数字符数词数

   常用的选项为:

         -l :统计行数

       -m :统计字符数

        -w :统计词数

Linux  shell之初入门_shell编程_15

6 、uniq:去重复的行

       -c :统计重复的行数,并把行数写在前面

  -d: 只显示重复的行

  -u:只显示没重复的行

7、tr替换字符,常用来处理文档中出现的特殊符号常用的选项有两个:

      -d :删除某个字符,-d 后面跟要删除的字符

      -s :把重复的字符去掉

   最常用的就是把小写变大写:tr [a-z]’ ‘[A-Z]

Linux  shell之初入门_shell编程_16