第一章:认识Shell脚本

1.1、什么是Shell

Shell是系统的用户界面,提供了用户与内核进行交互操作的一种接口。它接收用户输入的命令并把它送入内核去执行。

实际上Shell是一个命令解释器,它解释由用户输入的命令并且把它们送到内核。不仅如此,Shell有自己的编程语言用于对命令的编辑,它允许用户编写由shell命令组成的程序。Shell编程语言具有普通编程语言的很多特点,比如它也有循环结构和分支控制结构等,用这种编程语言编写的Shell程序与其他应用程序具有同样的效果。

1.2、什么是Shell脚本(Shell Script)

Shell脚本最常用于系统管理工作,Shell脚本与Windows/Dos下的批处理相似,也就是用各类命令预先放入到一个文件中,方便一次性执行的一个程序文件,主要是方便管理员进行设置或者管理用的。但是它比Windows下的批处理更强大,比用其他编程程序编辑的程序效率更高,它使用了Linux/Unix下的命令。

1.3、脚本编程语言与编译型语言的区别

许多中型、大型的程序都是用编译型语言写成,例如C、C++、JAVA等。这类程序只要从源代码转换成目标代码(机器语言),便能直接通过计算机来执行。编译型语言的好处就是运行速度快,缺点则是它们多半运作于底层,所处理的是字节、整数、浮点数或是其他机器层级的对象。例如在C++里,很难进行”将一个目录里所有的文件复制到另一个目录中”之类的简单操作。

脚本编程语言通常是解释型。这类程序的执行,不需要编译,直接由解释器读入程序代码,并将其转换成内部的形式,再执行,所以运行速度相对编译型语言要慢。请注意,解释器本身是一般的编译型程序。

1.4、为什么要使用Shell脚本

脚本编程语言(Shell脚本)多半运行在比编译型语言还高的层级,能够轻易处理文件与目录之类的对象。缺点则是脚本编程语言运行速度通常不如编译型语言。不过权衡之下,通常在Linux系统管理方面使用脚本编程是非常高效的。花一个小时写成的简单脚本同样的功能用C或C++来编写实现,可能需要更多的时间。而且一般来说,脚本运行速度已经够快了,快到足以让人忽略它性能上的问题。

1.5、Shell脚本的类型(解释器的种类)

Shell脚本的类型有很多,目前流行的Shell脚本包括ash、bash、ksh、csh、zsh等,用户可以通过查看/etc/shells 文件中的内容来查看自己主机中当前有哪些种类的Shell脚本。

范例:

[root@cloucentos6 ~]# cat /etc/shells

/bin/sh

/bin/bash

/sbin/nologin

/bin/tcsh

/bin/csh

1.6、一个简单的shell脚本

打开文本编辑器(可以使用vi/vim命令来创建文件),新建一个文件test.sh,扩展名为sh(sh代表shell),扩展名并不影响脚本执行,见名知意就好,如果你用php写shell 脚本,扩展名就用php好了。

[root@cloucentos6 home]# vim test.sh         #使用vim文本编辑器编写test.sh脚本

#!/bin/bash

echo "hello world!"

[root@cloucentos6 home]# chmod +x test.sh    #赋予test.sh执行权限

[root@cloucentos6 home]# ./test.sh          #执行test.sh脚本

hello world!

1.7、Shell脚本第一行#!意义

标注:如果脚本作为sh的命令行参数运行,脚本第一行声明#!/bin/bash就不起作用。

Shell脚本开头第一行基本都以#!打头,它不是注释,"#!/bin/sh"是对shell的声明,说明你所用sh解释器及/bin/sh是sh的路径;告诉操作系统, 此脚本的解释器为 /bin/sh 这个可执行文件, 如果你的脚本用 bash解释, 第一行就应该是

#!/bin/bash

如果Shell脚本没有这样定义的第一行, 不同 unix 类操作系统会用默认 shell 来解释脚本, 如 unix 往往是 sh, linux 往往是用 bash等等。本教程主要采用bash解释器。

1.8、Shell 脚本两种执行方式

打开终端一般都会出现一个提示符,其形式通常如下所示:

[root@cloucentos6 home]#

bash-4.1$

其中#代表系统超级用户,$代表系统普通用户。超级用户是Linux系统中权限最高的用户。

shell脚本运行方式一:将test.sh脚本作为sh的命令行参数运行

[root@cloucentos6 home]# sh test.sh     #假设test.sh脚本位于当前/home目录下

[root@cloucentos6 home]# sh /home/test.sh   #使用test.sh完整路径

[root@cloucentos6 home]# /bin/sh test.sh

shell脚本运行方式二:将test.sh脚本赋予执行权限的可执行文件,即chmod +x test.sh

[root@cloucentos6 home]# ./test.sh     #此命令 ./表当前目录

[root@cloucentos6 home]# /home/test.sh  #使用test.sh脚本的完整路径

 

1.9、变量

  变量从字面上就是可以变化的量,每一个变量的值都是字符串,无论变量赋值有没有使用引号,值都会以字符串的形式存储。脚本语言通常不需要在使用变量之前声明其类型,只需要直接赋值即可。有一些特殊的变量会被shell环境和操作系统环境用来存储一些特别的值,这类变量被称为环境变量。

变量的定义,只能以字母和下划线开始,区分大小写,可以包含数字、字母或下划线符号。

变量的赋值的方式为:先写变量名称,紧接着=字符,最后就是新值,中间完全没有任何空格;当你想取出Shell变量的值时,需在变量名称面前加上$字符;当变量所赋予的值内含空格时,需要加上双引号;当几个变量连接起来时,也需要使用双引号。

标注:变量赋值var=value不能写成var = value,前者是赋值操作,后面是相等操作。获取var变量的值可以使用echo $var 或 echo ${var}

范例1:

[root@localhost home]# vim test.sh         #编写一个test.sh脚本

#!/bin/sh

var1=hello

echo $var1

var2=man!

echo ${var2}

var3="hello boy!"

echo $var3

var4="$var1 $var2 $var3"

echo $var4

 

[root@localhost home]#./test.sh            #执行test.sh脚本,运行后结果如下

hello

man!

hello boy!

hello man! hello boy!

获取字符串长度,length=${#var}

范例2:

[root@cloucentos6 home]# cat test.sh

#!/bin/bash

var=1234567890

echo ${#var}

[root@cloucentos6 home]# ./test.sh

10

1.10、简单跟踪shell脚本

范例1:使用选项 –x启动跟踪调试shell脚本

[root@localhost home]#sh -x ./test.sh    #通过sh  -x跟踪test.sh脚本

+ sh -x ./test.sh

+ echo 'hello!man'

hello!man

+ printf 'hello!boy\n'

hello!boy

范例2:通过set  -x  命令在test.sh脚本指定跟踪到一小部分,然后在使用 set  +x闭关跟踪功能。

[root@localhost home]#vim test.sh  #只跟踪text.sh脚本里的echo hello!man这行命令

#!/bin/sh

set -x

echo hello!man

set +x

printf "hello!boy\n"

[root@localhost home]# ./test.sh

+ ./test.sh

+ echo 'hello!man'

hello!man

+ set +x

hello!boy

通过在脚本第一行声明#!/bin/bash修改成 #!/bin/bash –xv同样也能启用跟踪调试功能。

第1章:认识Shell脚本的更多相关文章

  1. 第十二章 学习 shell脚本之前的基础知识

    http://www.92csz.com/study/linux/12.htm [什么是shell] 简单点理解,就是系统跟计算机硬件交互时使用的中间介质,它只是系统的一个工具.实际上,在shell和 ...

  2. 第一章:shell脚本初入门

    1.shell脚本中的source或者.空格再加上文件,表示加载文件中的命令及语句(困惑多时终于解开^-^) 2.脚本开头书写好作者版本等信息,方便维护:流程语句提前把格式写好,防止遗漏 3.定义字符 ...

  3. 一篇文章学会shell脚本

    一.Shell传递参数 #!/bin/bash # 假设在脚本运行时写了三个参数 ..,,则 "(传递了三个参数). echo "-- \$* 演示 --" for i ...

  4. 《Linux命令行与shell脚本编程大全》 第二十七章 学习笔记

    第二十七章:shell脚本编程进阶 监测系统统计数据 系统快照报告 1.运行时间 uptime命令会提供以下基本信息: 当前时间 系统运行的天数,小时数,分钟数 当前登录到系统的用户数 1分钟,5分钟 ...

  5. 《Linux命令行与Shell脚本编程大全第2版》读书笔记

    公司说不准用云笔记了,吓得我赶紧把笔记贴到博客上先..... 近3年前的了,只有一半的章节,后面的没空记录了.... 第1章 可以cat /proc/meminfo文件来观察Linux系统上虚拟内存的 ...

  6. 转载:shell脚本之前的基础知识

    转载地址:http://www.92csz.com/study/linux/12.htm 第十二章 学习 shell脚本之前的基础知识 日常的linux系统管理工作中必不可少的就是shell脚本,如果 ...

  7. shell脚本从入门到精通

    阿里云大学 shell脚本从入门到精通 第1 章 : shell脚本编程-变量-算术表达式-判断语句-if分支语句 第2 章 : case-for-While-双括号-循环嵌套-break-conti ...

  8. 优化对称加密的 shell 脚本

    前言 之前一篇文章<shell 脚本实现文件对称加密>中,讲述了如何用 shell 脚本实现对称加密. 之后写管理密码脚本时,发觉该脚本的处理速度非常慢,而其原因就在 shell 的处理命 ...

  9. 《Linux命令行与shell脚本编程大全》 第二十三章 学习笔记

    第二十三章:使用数据库 MySQL数据库 MySQL客户端界面 mysql命令行参数 参数 描述 -A 禁用自动重新生成哈希表 -b 禁用 出错后的beep声 -B 不使用历史文件 -C 压缩客户端和 ...

  10. 《Linux命令行与shell脚本编程大全》 第二十二章 学习笔记

    第二十二章:使用其他shell 什么是dash shell Debian的dash shell是ash shell的直系后代,ash shell是Unix系统上原来地Bourne shell的简化版本 ...

随机推荐

  1. 【内核】linux2.6版本内核编译配置选项(一)

    Linux 2.6.19.x 内核编译配置选项简介 作者:金步国 版权声明 本文作者是一位自由软件爱好者,所以本文虽然不是软件,但是本着 GPL 的精神发布.任何人都可以自由使用.转载.复制和再分发, ...

  2. Asp.Net文件夹没有读写权限的特殊问题

    如果asp.net网站权限都配置正确,但是仍然出现某一个文件或者文件夹没有读写权限时 原来只用在Web.config里面的  <system.web>节点下增加<identity i ...

  3. 使用Python实现Map Reduce程序

    使用Python实现Map Reduce程序 起因 想处理一些较大的文件,单机运行效率太低,多线程也达不到要求,最终采用了集群的处理方式. 详细的讨论可以在v2ex上看一下. 步骤 MapReduce ...

  4. My To Do List (Task Manager)

    My To Do List (Task Manager) With everything that business owners deal with throughout their day, th ...

  5. Oracle数据库密码过期

    按照如下步骤进行操作:1.查看用户的proifle是哪个,一般是default: SQL>SELECT USERNAME,PROFILE FROM DBA_USERS; 2.查看指定概要文件(如 ...

  6. C#如何调用R

    1. 现在R中安装rscproxy库 > install.packages(rscproxy) > library(rscproxy)   2. 到这个网站http://rcom.univ ...

  7. hbase源码系列(十)HLog与日志恢复

    HLog概述 hbase在写入数据之前会先写入MemStore,成功了再写入HLog,当MemStore的数据丢失的时候,还可以用HLog的数据来进行恢复,下面先看看HLog的图. 旧版的HLog是实 ...

  8. Hbuilder开发app实战-识岁03-文件上传

    前言 做app不得不谈的问题就是文件上传.用hbuilder开发app让上传变的非常easy. Uploader Uploader模块管理网络上传任务,用于从本地上传各种文件到server,并支持跨域 ...

  9. JS监听页面----无鼠标键盘动作,自动跳页

    function ScreenSaver(settings){ this.settings = settings; this.nTimeout = this.settings.timeout; doc ...

  10. 30个开源电子商务系统(PHP)

    osCommerce osCommerce是一款著名的PHP开源电子商务解决方案,提出“开箱即用”的强大功能,使网上商店安装非常方便快捷,并可以作为GNU通用公共授权的开源项目免费发布.osComme ...