细说Linux系统管理
上QQ阅读APP看本书,新人免费读10天
设备和账号都新为新人

2.2 Shell脚本的运行方式

2.2.1 输出命令echo

一般学习一种编程语言,写的第一个脚本都是打印“Hello world! ”,我们也写一个“Hello world! ”脚本用来学习一下Shell脚本的运行方式。不过在写脚本之前,我们需要学习一下Linux的打印命令echo。命令格式如下:

    [root@localhost ~]# echo [选项] [输出内容]
    选项:
        -e:    支持反斜线控制的字符转换(具体参见表2-2)
        -n:    取消输出后行末的换行符号(内容输出后不换行)

其实echo命令非常简单,命令的输出内容如果没有特殊含义,则原内容输出到屏幕;如果输出内容有特殊含义,则输出打印其含义。例如:

表2-2 控制字符

    例子1:
    [root@localhost ~]# echo "Mr. Shen Chao is the most honest man in LampBrother! "
    #echo的内容就会打印到屏幕上
    Mr. Shen Chao is the most honest man in LampBrother!
    [root@localhost ~]#

echo命令就是这么简单,输出什么内容,这个内容就会打印到屏幕上。现在关键点来了,这句话是什么意思呢?其实这是在兄弟连广为流传的、深入人心的、得到大家广泛认可的一句名言:“沈超老师是兄弟连最正直的人!”

    例子2:
    [root@localhost ~]# echo -n "Mr. Shen Chao is the most honest man in LampBrother! "
    Mr. Shen Chao is the most honest man in LampBrother! [root@localhost ~]#
    #如果加入了“-n”选项,则在输出内容结束后,不会换行,直接显示新行的提示符

在echo命令中如果使用了“-e”选项,则可以支持控制字符,如表2-2所示。

举几个例子来说明一下“-e”选项。

    例子3:
    [root@localhost ~]# echo -e "\\ \a"
    \
    #输出\,同时会在系统音响中输出一声警告音

在这个例子中,echo命令会输出\。如果不像“\\”这样写,那么,因为\有特殊含义,所以不会输出。

    例子4:
    [root@localhost ~]# echo -e "ab\bc"
    ac
    #在这个输出中,在b键左侧有“\b”,所以输出时只有ac

    例子5:
    [root@localhost ~]# echo -e "a\tb\tc\nd\te\tf"
    a      b      c
    d      e      f
    #因为加入了制表符“\t”和换行符“\n”,所以会按照格式输出

    例子6:
    [root@localhost ~]# echo -e "\0141\t\0142\t\0143\n\0144\t\0145\t\0146"
    a      b      c
    d      e      f
    #还是会输出上面的内容,不过是按照八进制ASCII码输出的

也就是说,141这个八进制数在ASCII码中代表小写的“a”,其他的以此类推。

    例子7:
    [root@localhost ~]# echo -e "\x61\t\x62\t\x63\n\x64\t\x65\t\x66"
    a      b      c
    d      e      f
    #如果按照十六进制ASCII码同样可以输出

echo命令还可以输出一些比较有意思的内容。

    例子8:
    [root@localhost ~]# echo -e "\e[1;31m  abcd \e[0m"

这条命令会把abcd按照红色输出。解释一下这个命令:\e[1是标准格式,代表颜色输出开始,\e[0m代表颜色输出结束,31m定义字体颜色是红色。echo命令能够识别的颜色如下:30m=黑色,31m=红色,32m=绿色,33m=黄色,34m=蓝色,35m=洋红,36m=青色,37m=白色。

    例子9:
    [root@localhost ~]# echo -e "\e[1;42m abcd \e[0m"

这条命令会给abcd加入一个绿色的背景。echo命令可以使用的背景颜色如下:40m=黑色,41m=红色,42m=绿色,43m=黄色,44m=蓝色,45m=洋红,46m=青色,47m=白色。

2.2.2 Shell脚本的运行

1.第一个Shell脚本

做什么事情都会有第一次,我们学习语言的第一次就是写著名的“Hello world! ”程序。命令如下:

    [root@localhost ~]# mkdir sh
    [root@localhost ~]# cd sh
    #建立Shell练习目录,以后我们的Shell脚本都保存在这个目录当中

    [root@localhost sh]# vi hello.sh
    #! /bin/bash
    #The first program
    # Author: shenchao(E-mail: shenchao@lampbrother.net)

    echo -e "Mr. Shen Chao is the most honest man in LampBrother"

大家发现了吗?在Shell脚本中是可以直接使用echo命令的。其实不止echo命令,所有的Linux命令都可以直接在Shell脚本中调用。这种特性使得Shell脚本和Linux系统结合得更加紧密,也更加方便了Shell脚本的编写。

解释一下这个脚本。

· 第一行“#! /bin/bash”。

在Linux中,以“#”开头的一般都是注释,不过这句话是例外的。这句话的作用是标称我以下写的脚本使用的是Bash语法,只要写的是基于Bash的Shell脚本都应该这样开头。这就像在HTML语言中嵌入PHP程序时,PHP程序必须用<? ? >包含起来。

不过,有一些比较喜欢钻研的人也会有疑问,他们在写Shell脚本时,不加“#! /bin/bash”这句话,Shell脚本也可以正确执行。那是因为我们是在默认Shell就是Bash的Linux中编写的脚本,而且脚本是纯Bash脚本才能够正确执行。如果把脚本放在默认环境不是Bash的环境中运行,又或者编写脚本的不是纯Bash语言,而是嵌入了其他语言(如Tcl语言),那么这个脚本就不能正确执行了。所以,大家还是要记住我们的Shell脚本都必须以“#! /bin/bash”开头。

· 第二行与第三行。

在Shell脚本中,除“#! /bin/bash”这行外,其他行只要以“#”开头的都是注释。第二行和第三行就是我们这个脚本的注释,建议大家在写程序时加入清晰而详尽的注释,这些都是建立良好编程规范时应该注意的问题。

· 第四行就是程序的主体了。

既然echo命令可以直接打印“沈超老师是兄弟连最正直的人!”,那么将这句话放入Shell脚本中也是可以正确执行的,因为Linux的命令是可以直接在脚本中执行的。

2.运行方式

Shell脚本写好了,那么这个脚本该如何运行呢?在Linux中,脚本的运行主要有这样两种方法:

· 赋予执行权限,直接运行。

这种方法是最常用的Shell脚本运行方法,也最为直接简单。就是赋予执行权限之后,直接运行。当然,运行时可以使用绝对路径,也可以使用相对路径。命令如下:

    [root@localhost sh]# chmod 755 hello.sh
    #赋予执行权限
    [root@localhost sh]# /root/sh/hello.sh
    Mr. Shen Chao is the most honest man in LampBrother
    #使用绝对路径运行
    [root@localhost sh]# ./hello.sh
    Mr. Shen Chao is the most honest man in LampBrother
    #因为我们已经在/root/sh目录中,所以也可以使用相对路径运行

Shell脚本是否可以像Linux系统命令一样,不用指定路径,直接运行呢?当然是可以的,不过需要进行环境变量的配置。在这里大家只需要知道,我们自己写的Shell脚本默认是不能直接运行的,要么使用绝对路径,要么使用相对路径。

· 通过Bash调用运行脚本。

这种方法也非常简单,命令如下:

    [root@localhost sh]# bash hello.sh
    Mr. Shen Chao is the most honest man in LampBrother

这种方法的意思是直接使用Bash去解释脚本中的内容,所以这个脚本也可以正常运行。使用这种方法运行脚本,甚至不需要脚本文件有“执行”权限,只要拥有“读”权限就可以运行了。

这两种Shell脚本的运行方式,大家可以按照个人习惯随意使用。