第一章:认识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. 【Android】Intent解读

    Intent 的作用 Intent 是一个将要执行的动作的抽象的描述,一般来说是作为参数来使用,由Intent来协助完成android各个组件之间的通讯. 比如说调用startActivity()来启 ...

  2. MSTP故障处理手册

    H3C核心交换机常见故障定位手册.pdf MSTP故障处理手册.pdf 目 录 1 MSTP故障处理 1.1 广播风暴故障处理 1.1.1 故障描述 1.1.2 故障处理流程 1.1.3 故障处理步骤 ...

  3. 【Python】京东商品价格监控

    import requests,json,re,winsound,time class Stock(object): def __init__(self): self.province_dict={v ...

  4. Java调用Python脚本工具类

    [本文出自天外归云的博客园] 在网上查了很多方法都不成功,在google上搜到一篇文章,做了一些小修改,能够处理中文输出.提取一个运行python脚本的Java工具类如下: package com.a ...

  5. pandas入门——loc与iloc函数

    oc与iloc函数 loc函数 import pandas as pd import numpy # 导入数据 df = pd.read_csv(filepath_or_buffer="D: ...

  6. JAVA-JSP内置对象之page对象调用Servlet

    相关资料:<21天学通Java Web开发> page对象1.page对象代表JSP转译后的Servlet.2.通过page对象可以非常方便地调用Servlet类中定义的方法. pageD ...

  7. [emacs] org-mode的一些小技巧

    Table of Contents 1 快速输入 #+BEGIN_SRC … #+END_SRC 2 代码按语法高亮 3 导出成HTML时的一些问题和技巧 3.1 生成目录表 3.2 为每个分节的标题 ...

  8. 如何通过Dreamweaver批量对整个站点或目录进行代码搜索或部分全部替换

    原文地址:http://www.idc523.com/faq/view-331.html 如何通过Dreamweaver批量对整个站点或目录进行代码搜索或部分全部替换 有的时候,我们希望修改网站代码或 ...

  9. bootstrap插件(对话框)bootbox参数和自定义弹出框宽度设置

    参考:https://hisune.com/post/view/17/bootstrap-plugin-bootbox-and-custom-width-dialog 官网:http://bootbo ...

  10. nginx封ip,禁用IP段的设置说明

    nginx的ngx_http_access_module 模块可以封配置内的ip或者ip段,语法如下: deny IP; deny subnet; allow IP; allow subnet; # ...