第一章:认识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. 搜索页面scroll下拉时候进行刷新,显示更多搜索值

    1.封装扩展scroll.vue功能: //props传值 pullup:{ type:Boolean, default:false } _initScroll(){ if(!this.$refs.w ...

  2. 导入第三方Jar包到Nexus私服

    公司里面有自己的公共代码库,如果希望交给Maven进行管理,可以搭建Nexus服务器,将公司的公共代码库的代码打成jar包,然后上传到Nexus私服服务器上,项目组的成员就可以在Maven项目中通过添 ...

  3. visual studio 2005提示脚本错误 /VC/VCWizards/2052/Common.js

    今天在做OCX添加接口的时候,莫名其妙的遇到visual studio 2005提示脚本错误,/VC/VCWizards/2052/Common.js. 网上找了很多资料,多数介绍修改注册表“vs20 ...

  4. RestTemplate 发送 get 请求使用误区 多值为null

    http://blog.csdn.net/zhousenshan/article/details/71055687 ****************************************** ...

  5. 【Math】证明:实对称阵属于不同特征值的的特征向量是正交的

    证明:实对称阵属于不同特征值的的特征向量是正交的. 设Ap=mp,Aq=nq,其中A是实对称矩阵,m,n为其不同的特征值,p,q分别为其对应得特征向量. 则 p1(Aq)=p1(nq)=np1q (p ...

  6. JAVA-JSP内置对象之request获得参数的所有参数值(多个值)

    相关资料:<21天学通Java Web开发> 获得参数的所有参数值(多个值)1.需要使用request对象的getParameterValues()方法. RequestForm4.jsp ...

  7. 基于jQuery的新浪游戏首页幻灯片

    分享一款基于jQuery的新浪游戏首页幻灯片,带左右箭头,选项卡缩略图,自动轮播切换的jQuery幻灯片代码.效果图如下: 在线预览   源码下载 实现的代码. html代码: <br>& ...

  8. swing自定义border

    public class MyBorder extends AbstractBorder { private static final long serialVersionUID = 1L; priv ...

  9. H2O中的随机森林算法介绍及其项目实战(python实现)

    H2O中的随机森林算法介绍及其项目实战(python实现) 包的引入:from h2o.estimators.random_forest import H2ORandomForestEstimator ...

  10. sql sever跨数据库复制数据的方法

    1,用Opendatasource系统函数 详细的用法已经注释在sql代码中了.这个是在sqlserver到sqlserver之间的倒数据.2005,2008,2012应该都是适用的. --从远程服务 ...