1. 认识shell script

shell script是利用shell的功能缩写的一个“程序”,这个程序是使用纯文本文件,将一些shell的语法与命令(含外部命令)写在里面,搭配正则表达式,管道命令与数据流重定向等功能,以达到我们想要的处理目的。

shell script有很广泛的应用:
(1)自动化管理的重要依据
(2)追踪与管理系统的重要工作
(3)简单入侵检测功能
(4)连续命令单一化
(5)简易的数据处理
(6)支持跨平台

所以说,shell script用在系统管理上面是很好的一项工具,但是其也有一定的缺点,在处理大量的数值计算时,速度较慢,占用CPU资源较多,会造成主机资源分配不良。

2. shell script程序编写

对于shell script程序的编写,使用编辑工具vim,这是一个很好用的文本编辑命令。
首先,使用bash命令,创建一个脚本程序
[yr@localhost shellscript]$ vim helloworld.sh

//在打开的文本中,编辑程序,helloworld.sh

#!/bin/bash
#Program:
# This is my first shell script program. It will show "Hello World!" on
# the screen.
PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin
export PATH
echo -e "Hello World! \a \n"
exit 0

程序内容解析:

(1)第一行 #!/bin/bash 是声明这个script所使用的shell名称,每一个shell script脚本内容,必须在第一行进行对此声明。也就是说,我们使用的是bash命令,必须声明这个文件,来使用bash的语法;
(2)除了第一行外,以#开头的语句均是批注的作用,也就是类似于普通C程序中的注释;
(3)主要环境变量的声明,鸟哥建议,PATH与LANG是最重要的,如有使用,建议务必将一些重要的环境变量设置好,这样可以让程序进行时,直接执行外部命令,不必写绝对路径;
(4)主要程序内容,在本文件中只有echo这一行;
(5)告知执行结果,利用exit命令,让程序中断,并回传一个数值给系统,0值代表成功,非0值则是代表错误;

3. 程序的编译运行

对于shell script有两种运行方式:
(1)使用 sh命令执行,或者使用chmod改变文件权限,直接用./helloworld.sh 执行 —— 子进程执行
[yr@localhost shellscript]$ sh helloworld.sh
Hello World!

[yr@localhost shellscript]$ chmod +x helloworld.sh

[yr@localhost shellscript]$ ./helloworld.sh 
Hello World!


(2)使用source filename 或者. filename 执行—— 父进程执行
这儿有个问题需要说明,当程序中有exit 0 这个结束命令时,我们使用source filename 或者. filename 来执行程序时,会出现终端一闪终止的状况,这并不代表程序没有成功运行,而是由于exit 0 这个命令,使得程序运行结束后,结束了父进程,也就是结束了我们的终端。所以要想继续留在该终端界面,我们可以将程序内容的最后一行exit 0删除,再次运行即可。
[yr@localhost shellscript]$ vim helloworld.sh

//在打开的文本中,编辑程序,helloworld.sh

#!/bin/bash
#Program:
# This is my first shell script program. It will show "Hello World!" on
# the screen.
PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin
export PATH
echo -e "Hello World! \a \n"
# 删除最后一行 exit 0

下面执行命令:

[yr@localhost shellscript]$ source helloworld.sh 

Hello World!
<pre code_snippet_id="666753" snippet_file_name="blog_20150514_3_8535676" name="code" class="cpp">[yr@localhost shellscript]$ . helloworld.sh 

Hello World!  



我们看到,以上两种方式,都可以顺利成功的将脚本和helloworld.sh执行完毕。

4. 两种编译方式详解

(1)利用直接执行的方式来执行脚本:在子进程中运行
(2)使用source来执行脚本:在父进程中执行
下面用一个实际例子详细说明:
我们新建一个新的脚本test.sh
[yr@localhost shellscript]$ vim test.sh

//下面是程序内容
#!/bin/bash
#Program
# User inputs his first name and last name. Program shows his full name.
#History:
# 2015/05/14 shine_yr First release
PATH=/bin:/sbin:/usr/bin:/usr/sbin:usr/local/bin:usr/local/sbin:~/bin
export PATH read -p "Please input your first name: "firstname #提示用户输入
read -p "Please input your last name: "lastname #提示用户输入
echo -e "\nYour full name is: $firstname $lastname" #结果在屏幕输出 # exit 0 我们不用退出命令

首先,利用直接执行的方式来执行脚本:

[yr@localhost shellscript]$ sh test.sh
Please input your first name: shine
Please input your last name: yr Your full name is: shine yr
[yr@localhost shellscript]$ echo $firstname [yr@localhost shellscript]$ echo $lastname [yr@localhost shellscript]$

从上面可以看出,程序顺利执行,然后我利用echo命令打算输出firstname以及lastname的内容,结果却输出为空。

这是什么原因呢?
这就是说此方式在当子进程完成后,子进程中的各项变量或者操作都将会结束而不会传回到父进程中,如下图所示:

然后,使用source filename 或者 . filename的方式执行脚本:

它是在当前bash环境下读取并执行filename中的命令,而且该命令通常用 . filename来替代。

[yr@localhost shellscript]$ source test.sh
Please input your first name: shine
Please input your last name: yr Your full name is: shine yr
[yr@localhost shellscript]$ echo $firstname
shine
[yr@localhost shellscript]$ echo $lastname
yr
[yr@localhost shellscript]$

我们可以看到,此时变量firstname以及lastname 中是有确切值的。

也就是说,此时test.sh会在父进程中执行,因此各项操作都会在原本的bash中生效。


5. 编写shell script的良好习惯

在头文件处记好:
(1)script的功能
(2)script的版本信息
(3)script的作者与联络方式
(4)script的版权声明方式
(5)script的History(历史记录)
(6)script内较特殊的命令,使用“绝对路径”的方式来执行
(7)script执行时需要的环境变量预先声明与设置

除此之外,我们还应该习惯用[Tab]键来控制格式,另外,使用vim而不是vi作为编写工具,因为vim的功能更强大,不仅有颜色提示,还有语法检测功能。

菜鸟的《Linux程序设计》学习—shell script的更多相关文章

  1. 菜鸟教程之学习Shell script笔记(上)

    菜鸟教程之学习Shell script笔记 以下内容是,学习菜鸟shell教程整理的笔记 菜鸟教程之shell教程:http://www.runoob.com/linux/linux-shell.ht ...

  2. linux基础之Shell Script入门介绍

    本文介绍下,学习shell script编程的入门知识,通过几个入门实例,带领大家走进shell script的神圣殿堂,呵呵,有需要的朋友参考下. 本文转自:http://www.jbxue.com ...

  3. 菜鸟教程之学习Shell script笔记(下)

    菜鸟教程Shell script学习笔记(下) 以下内容是学习菜鸟教程之shell教程,所整理的笔记 菜鸟教程之shell教程:http://www.runoob.com/linux/linux-sh ...

  4. 菜鸟教程之学习Shell script笔记(中)

    菜鸟教程Shell script学习笔记(中) 以下内容是学习菜鸟教程之shell教程,所整理的笔记 菜鸟教程之shell教程:http://www.runoob.com/linux/linux-sh ...

  5. bash shell学习-shell script基础 (笔记)

    A chain no stronger than its weakest link. "一着不慎,满盘皆输" 参考资料:鸟哥的Linux私房菜 基础学习篇(第三版)  Linux ...

  6. Linux程序设计之shell程序设计

    看了<linux程序设计(第4版)>(作者:Neil Matthew ,Richard Stones ,陈建 ,宋健建译).做个笔记,以备后面查看. 首先,清楚几个概念. shell编程属 ...

  7. Linux基础之-shell script(变量,运算符,流程控制,函数)

    一.shell script Shell 脚本(shell script),是一种为shell编写的脚本程序.业界所说的shell通常都是指shell脚本,但读者朋友要知道,shell和shell s ...

  8. Linux程序设计学习笔记(独乐乐版)

    在Android的开发过程中经常会遇到Linux相关的问题,为了更彻底的了解Linux准备整点没用的,找到一本 <Linux程序设计>开始系统的学习. 期间记录下自认为重要的内容,本以为是 ...

  9. Linux08--Shell程序设计03 shell script

    第一个Shell脚本——HelloWorld [root@localhost ~]# vi sh01.sh #!/bin/bash #!表明使用哪种shell # this is my first s ...

随机推荐

  1. ko.js循环绑定值问题(工作遇见)

    fewTags()这是一个数组,循环实现以上效果,箭头所指的不属于循环出来的值, 以前循环是绑定在<div class="file-tag-list">中造成编辑不能在 ...

  2. scrapy框架中Spiders用法

    scrapy框架中Spiders用法 Spider类定义了如何爬去某个网站,包括爬取的动作以及如何从网页内容中提取结构化的数据 总的来说spider就是定义爬取的动作以及分析某个网页 工作流程分析 以 ...

  3. Tinghua Data Mining 2

    数据预处理 https://www.bilibili.com/video/av23933161/?p=11 http://www.xuetangx.com/courses/course-v1:Tsin ...

  4. python_21(Django中间件)

    第1章 中间件 1.1 介绍 1.2 种类 1.3 自定义中间件 1.4 process_request 1.4.1 注册中间件 1.5 process_response 1.6 process_vi ...

  5. 使用SSL配置Nginx反向代理的简单指南

    反向代理是一个服务器,它接收通过Web发出的请求,即http和https,然后将它们发送到后端服务器(或服务器).后端服务器可以是单个或一组应用服务器,如Tomcat,wildfly或Jenkins等 ...

  6. php 几个比较实用的函数

    最近在看代码,发现以下是几个比较实用的函数. 1,取客户端IP 查看复制打印? function getOnlineIp() { $strOnlineIp = ""; if(get ...

  7. Ice-cream Tycoon9(线段树)

    线段树的一些基本应用,就是函数写了很多,有点繁琐. 以每个物品的单价建树,刚开始写了个裸的想水过去直接MLE了,然后又离散化了下. 离散化单价后建树,lz数组用来清零,s数组保存结点所含物品个数,co ...

  8. PHP知识点总结4

    file1.php <?php namespace Foo\Bar\subnamespace; const FOO = 1; function foo() {} class foo { stat ...

  9. js filter用法比较

    讲解一个很实用的JS小语法 filter 就是从数组中找到适合条件的元素(比如说大于某一个元素的值) var arr=[1,23,5,78,34,55,13]; 如何才能找到大于23的所有元素呢, 1 ...

  10. 解决spring http输入流和输出流只能读取一次

    1.需求:给某些请求接口记录日志,记录请求的数据和响应的数据和请求所花费的时间.这里采用非侵入式编程,也业务代码进行解耦.按照spring AOP 的编程思想. 2.编程设计:在spring 拦截器中 ...