shell脚本学习基础

本篇博客将会介绍(Contents):

      1、什么是shell,shell解释器和命令(或称工具)之间有什么区别

      2、“变量”和“命令”的区别

      3、出口状态和标准输出的区别:标准输入和参数的区别;

      4、linux中的空格

      5、如何执行shell脚本

      6、接下来几篇博客内容

      7、使用和参考书籍 References

 

前言:

Linux中基本就这些东西:变量、命令、特殊符号

在shell脚本编程中只是多了用于循环的关键字

 在操作上就是这些东西的组合罢了。

 

一、什么是shell,它和命令的区别是什么

      shell是命令行解释器。命令是一个个的工具。

                    参考《精通UNIX shell脚本编程》(第2版)—Randal K.Michael编著、李德龙译

       类比,bash和grep。bash是一种shell,grep是一种工具,两种独立运作。举例:在Terminal(终端)输入:grep -i az * 首先这条命令会被提交给系统默认shell(bash),bash会对这条命令进行一定的解析,这个“*”会被shell先解析,然后替换成当前目录下的各种文件。然后再把这些参数提交给grep工具,所以grep工具接受到的参数是什么: -i,az,和当前目录下的所有文件。然后具体检索,就是grep工具来完成的。

        那bash有什么用呢?bash相当于语言,而grep, find等等,相当于一个个别人已经写好的库。我们在bash中可以用for语法,循环调用这些库,来完成特定的功能(和C语言中很像)。

 

       当我们打开Ubuntu的Terminal时,进入的是Bash Shell,输入一条命令后,提交给该shell进行解释,注意是解释,shell把该解释的,解释完成后,就会检索该命令的位置。然后把参数提交给该命令,由该命令与系统进行交互。此时就不是shell来执行了,而是提交给命令(或称工具)来执行。

        这些命令就是一个个用于与系统打交道的小工具,或称系统命令。

       系统命令随Linux的安装而安装,其相对于bash shell来说是外部命令;另有些工具是bash shell的内建工具,对于bash shell来说属于内部命令;所有的工具都是用于更好的与系统进行交互和管理系统。

        Bash Shell有自己的语法,有自己解释的方式,所以自成一门语言。而这门语言中大量调用了工具(或称命令),这些工具不是bash shell语言的一部分,而是独立的工具。

                              以上概念参考《UNIX shell范例精解》(第四版)--Ellie Quigley编著 李化译。

     《Linux指令从初学到精通》—华清远见嵌入式培训中心 贺丹丹 等编著的书对于shell的介绍是:

        shell作为操作系统的外壳,是操作系统的最外层。为用户提供了使用操作系统的接口。

        shell有三种特征:

            1、shell是用户和Linux内核之间的接口程序;

            2、shell又是一个命令语言解释器;

            3、shell的另一个重要特性是它本身就是一个解释型的程序设计语言。它支持绝大多数高级语言中的程序元素,比如:函数、变量、数组合程序控制结构。

 

       总之,shell提供的是一个CLI(命令行界面),解释的是shell的变量和自身的语法结构等;众多的命令是一个个工具,由shell来操作这些应用程式。

       不同的shell,比如Bash shell、C shell、Korn shell……等等,他们之间语法和内部命令之间会有差别。Linux系统默认的是Bash,可以通过echo $SHELL来查看当前是使用的哪个shell环境。想要查看系统安装的所有shell,可以通过cat /etc/shells来查看。

 

二、 “变量”和“命令”的区别

    1、 变量和命令区别:

      变量:无非是系统分配的一组内存位置,用以存储各种数据。

      命令:是用来执行的,有选项、[输入]、最终会有一个命令状态输出。

      而位置参数属于变量的一种。

    2、 变量和命令的格式:

      变量的命名格式:任何字母、数字和下划线。第一个字符必须是字母或下划线。

      命令的使用格式:命令名 [命令选项]  [命令参数]

      命令名是系统固有的,虽然内部变量也是系统固有的(具体可以看shell内部变量一篇博客:)

    3、 变量和命令的引用区别:

      变量的引用与替换:${varible}   花括号

      命令替换:$(command)           圆括号

 

注意:一定要分清哪些是变量,哪些是命令,并清除地知道他们区别,引用区别,使用区别等等。

      比如:PATH (内部变量)和pwd(内部命令)  

         引用:PATH:echo $PATH      或    echo ${PATH}    

                   pwd :echo $(pwd)      或    echo `pwd` (注意这个是反引号)   或   echo $(pwd)   (反引号和$()作用一样)

      变量可以用$variable引用,但千万别 $command;命令用$直接引用几个意思?(对,没错,我之前就老干这事^^)

          shell设置的内部变量会在另一篇博客中有讲:(等待一个链接^^)

最后注意:linux区分大小写

 

三、出口状态和标准输出的区别:

       ⑴ 出口状态:只要是执行命令,都会有一个出口状态,用于显示这个命令是否正常执行。

              比如,命令:echo hello

                       标准输出:hello

                       查看其出口状态可以用:$?,通过命令:echo $?

                       如果输出为0  ,则表示echo hello正常运行;如果输出为其它,表示非正常运行。

              具体查看出口状态的操作,可以看shell设置的内部变量:(等待一个链接)

       ⑵ 标准输出标准输入文件(stdin),通常对应终端的键盘;标准输出文件(stdout)和标准错误输出文件(stderr),这两个文件都对应终端的屏幕。

        比如命令expr 1 + 1会把结果送到标准输出,在终端屏幕也可以显示;再比如命令:echo hello标准输出为hello,这个标准输出直接被送到了显示器。

       ⑶ 出口状态和标准输出的区别:

             每一个命令的执行都会有一个出口状态,但是,并不是每一个命令都会有标准输出。

             标准输出可以被直接赋值,echo显示命令的标准输出,或者用管道把标准输出送给其它命令。而出口状态并不会输出,只能被查看。只是用来显示这个命令是否正常执行。

             标准输出可以被用来直接赋值或输出;而命令的出口状态一般只能通过shell内部变量的引用来查看。

 

       实际举例:我曾经就傻傻的把出口状态当做标准输出来用,还不知道错在哪里:

    在用命令:let “5<2”时,犯的一个错误,具体可查看数值计算相关博客,查看为什么这个数值计算命令在使用时会出错:(等待数值计算的那一篇博客链接)

       这一块理解的不是很好,具体还要再查一下其它书籍或者百度一下,手上这本书上没有这方面的区分,在搜索的同时和管道“|”的那个标准输出在一起搜索一下。

       ⑷ 命令的标准输入和参数的区别:

        标准输入:一般都是指向从键盘输入,比如你用cat命令,它接收的就是键盘输入(标准输入)然后把它输出来,类似的还有wc命令等。而标准输入重定向就是说,可以重新指向标准输入的来源,不从键盘,而是从文件。能够接收标准输入的命令,就能够用标准输入重定向到文件进行读取数据。至于哪些命令可以接收标准输入:点击打开链接

       参数算不算标准输入?参数当然不是标准输入,标准输入数据来源默认是键盘。而参数,是随命令一起被传入的。比如echo命令,单单一个echo,就输出一行空行,也不会让你从键盘中输入任何东西。当然,标准输入重定向也不能用于echo命令,因为它不接受。echo命令只接收参数,如果是命令,那么就只能对其标准输出进行引用,用$()等。比如echo hello,这个hello就是命令参数。如何将一个命令的结果作为下一个命令的参数:点击打开链接

 

四、linux中的空格

        1、意外空格,导致意外的结果:

      命令:echo hello >test file   (本意是把echo标准输出重定向到test file文件)

      结果:创建一个test文件,内容是hello file(这就很神奇hhh),并不会创建一个test file文件

         更正:

      命令:echo hello >”test file”

         输出:创建了一个test file文件,内容为hello。这样就不会出现只创建test文件的尴尬,而是创建了test file文件。

         分析:linux中空格一般是用于字符的隔断,中间有空格就代表是两个字符了,可以使用转义符号、单、双引号来解决一个字符串中有特殊符号的情况。

         单、双引号的具体使用可以看其中一篇博客:(等一个链接)

        2、没有合适的空格,导致的报错:

        举例:

        脚本代码:

        funtion()

        {

             echo hello

         }1>test 2>&1

     执行:bash function

     输出:./test: line 5: syntax error: unexpected end of file

     分析:最后一句“} 1>test 2>&1” 注意:“}”与“1>test”之间必须要有空格

        至于有没有空格这样的情况,大多数情况是比较好分辨的,一般独立的两项之间是要加空格的;如果空格也是字符串的一部分,把整体用单或双引号括起来就可以了。其它特殊符号也是同样的做法。

 

五、如何执行shell脚本

执行shell脚本主要有两种方式:

    1、直接提交给对应程序进行执行。比如,利用命令:sh或bash

    2、修改文件为可执行,然后运行它

 

    下面对这两种进行一个详细的介绍:

  第一种:提交给对应的程序:bash或sh或tcsh……

    举例:脚本文件sum

    命令:bash sum   或    sh sum   或   tcsh sum

    区别:用不同的命令,意味着你把这个文件提交给不同的shell去执行,不同的shell在语法,命令用法和最后的输出上会略有不同。

    竟然这么多shell版本,那么应该用哪一个?

    当然是bash!!因为由于bash相当的优秀,操作合理,其他的版本基本已经被淘汰了,所以以后执行脚本文件的命令就是:bash filename。介绍不同shell版本的博客: 点击打开链接

 

     第二种:修改文件的权限为可执行文件,然后运行它

      ① 修改权限

    最开始我们用vi编辑一个脚本文件,就是一个普通的文本文件。脚本编完后可以把这个文件的权限修改为可执行文件。

    使用命令:chmod 755 filename

                      chmod a+rx filename

                      chmod u+rx filename

      以上三种命令选择之一就好,它们的区别仅在于对文件属主和其它用户一些权限的区别。

    ② 运行

      文件修改为可执行文件后,就可以执行它了。

    命令: 1、./filename  (注意是“./”,“./”表示当前工作目录,而“~”表示当前用户主目录

                 2、filename   (如果脚本文件filename在PATH路径中可以找到,可以直接这样写。注意是PATH路径,系统默认就是从PATH路径中去找,不过并不会自动包含当前工作目录)

        

        最后,注意区分:“./filename”和“. filename(点 . 与filename中间有空格)”之间的区别。

                    1、“./”表示当前路径、

                   2、 “.”是一个shell内部命令,相当于命令source,用于读取shell脚本,并在当前Shell环境(比如shell脚本)中执行。而filename的路径会在 PATH中的路径当前路径 进行寻找(和上面的区别),也可以使用绝对路径

                    所以,为避免混淆,最好用source命令替代点命令。

                    这两者的联系,比如命令:. ./filename  最前面的点是命令,后面的./filename是filename的绝对路径。命令和文件名之间需要加空格。

 

       需要注意的是

       1、在文件第一句需加上“#!/bin/bash”(其实也可以不加,不加的话调用的就是系统默认的那个shell,一般就是bash,不过加上最好)

       含义:调用指定的shell执行这个shell脚本。

       当然你也可以在下面选择一个加在脚本文件的首行替换#!/bin/bash:

             #!/bin/bash

             #!/bin/sh

             #!/bin/ksh

             #!/bin/tcsh

                ……

       虽然一般只用bash 

       2、打开了两个Terminals,两个Terminals的信息并不同步。比如:你可以一个terminal是root权限,一个是普通用户权限。再比如:在这个terminal中更改.bashrc中的PATH,然后source .bashrc,在另一个terminal可能并不会生效。

 

注意:某些操作可以出现在交互式shell,但是不能出现在非交互式shell(如shell脚本)中。具体可以查看shell命令解析过程的博客:(等待一个链接)

 

六、接下来几篇内容:

    接下来几篇介绍:符号、shell脚本中基本语法、一些命令和shell命令解析过程。

      其中符号的分类较多,先在这里给个目录:

符号:

        1、后台进程:&    点击打开链接 

        2、I/O重定向:>   <    >>    2>   1>   &1    点击打开链接 

        3、管道:|     点击打开链接 

        4、通配符: *  ?  [ ]     [ !  ]    [^   ]     点击打开链接 

        5、正则表达式与通配符:    点击打开链接

        6、转义符号和转义字符:\    点击打开链接 

        7、重复执行先前命令: !    点击打开链接 

        8、单、双引号与反引号的区别:    点击打开链接 

        9、变量引用、替换、命令替换、内部变量:$    点击打开链接 

       10、环境变量和shell内部变量:    点击打开链接 

       11、shell脚本的控制循环结构:    点击打开链接 

       12、命令解析过程:    点击打开链接 

       13、shell脚本的调试:    点击打开链接 

命令:

       1、test命令:    点击打开链接 

       2、数值计算命令:    点击打开链接 

       3、文件相关命令(开篇):

                ①  【文件操作1】文件查找工具:find:    点击打开链接

                ②  【文件操作2】文件内容检索工具:grep:    点击打开链接

                ③  【文件操作3】文本内容抽取工具:awk:    点击打开链接

                ④  【文件操作4】文本内容替换工具:sed:    点击打开链接

                ⑤  【文件操作5】文本内容比较工具:diff

       4、字符串相关命令:    点击打开链接

结课题目:

        1、

        2、

        3、

        4、

 

 

七、使用,参考,推荐的书籍和教程:

           

        该shell系列的更新均以《Ubuntu  Linux从入门到精通》(邢国庆 仇鹏涛 陈极珺等编著)这本书为基础 

  

      安排的路线:

        在大致了解了基本命令和shell脚本基本语法后,之后就是Linux的一些系统管理级命令,比如:磁盘监控与管理、网络监控与连接、CPU监控与优化、日志查找与系统维护……等等;再之后就是以Linux作为各种服务器的搭建与维护,比如:LMAP服务器、Mail服务器、Samba服务器、网络数据库、代理服务器、DNS服务器……等等;服务器当然就涉及到安全性方面,所以可以看看Linux渗透测试等内容。

 

      选书目录:

        在入门的基础上,可以选读一些其它的书,比如《Linux运维之道》丁明一编著 这本书,做为对Linux shell的一个补充。

        然后《Linux宝典》.任雪莲 或者 《Linux系统运维》.曹江华,国晓平. 北京:电子工业出版社 这两本书之一

        可以备一本类似《即用即查Linux命令行实例参考手册》—罗琳 编著的这种按功能分类,又比较全的指令集合,供用的时候查看。

        进阶可以参考《鸟哥的Linux私房菜—服务器架设篇》(第2版). 鸟哥. 北京: 机械工业出版社,然后是《网络服务搭建、配置与管理大全: Linux版》.(第2版). 张栋, 张瑞生. 北京: 电子工业出版社

       安全方面可以看看《Linux安全技术内幕》.李洋.北京:清华大学出版社 出版的书,以及《KailLinux&BackTrack渗透测试实战》. 赵涏元(韩). 金光爱译. 北京:人民邮电出版社 这两本书

 

        以上都是基于命令行的,如果你想体验一下Ubuntu的桌面应用,以及一些偏生活化操作,可以参考《Ubuntu完美应用》. 何晓龙.(第3版). 北京:电子工业出版社

 

      推荐链接:

        linux shell脚本的教程:点击打开链接,

        linux中符号:点击打开链接、

        网中人《shell十三问》:点击打开链接:

你可能感兴趣的:(shell脚本)