前言

学习shell脚本编程需要的知识储备:

vi/vim编辑器命令 vimrc设置要熟练

基础命令,100多个要熟练

基础和常用的网络服务命令要会:nfs 、 rsync、 inotify 、 lanmp 、 sersync  、ssh  key

一、shell脚本概念及示例

1、什么是shell

Shell是一个命令解释器,它在操作吸引的最外层,负责直接与用户对话,把用户的输入解释给操作系统,并处理各种各样的操作系统的输出结果,输出到屏幕返回给用户。这种对话方式可以是交互的方式(从键盘输入命令立即得到Shell的回应),或非交互(脚本)的方式。

2、什么是Shell脚本

当命令或语句不在命令行执行,而是通过一个程序文件执行时,该程序就被称为Shell脚本或Shell程序,Shell程序很类似DOS系统下的批处理程序(*.bat)。用户可以在shell脚本中敲入一系列的命令或命令语句、这些命令、变量和流程控制语句等有机的结合起来就形成了一个功能强大的shell脚本。

windows下利用批处理程序bat开发的备份网站及数据库的脚本。

@echo off

set date=%date:~0,4%-%date:~5,2%-%date:~8,2%

mysqldump -uroot -poldboy -A -B > D:\bak\"%date%".sql

rar.exe a -k -r -s -ml D:\bak\"%date%".sql.rar D:\bak\"%date%".sql

del D:\bak\*.sql

rar.exe a -k -r -s -ml D:\bak\"%date%"\htdocs.rar D:\work\PHPnow\htdocs

范例一、清除/var/log下message日志文件的简单命令文件

 #把所有命令放在一个文件里堆积起来就形成了脚本,下面是一个简单的命令形成的shell脚本
#要使用root身份来运行这个脚本
清除日志脚本,版本1
cd /var/log
cat /dev/null > messages
echo "Logs cleaned up."
提示:/var/log/messages是系统的日志文件,很重要

缺点:

1)不是root用户执行不了

2)没有流程控制,没有逻辑性。

范例二、包括命令、变量和流程控制语句的清除/var/log 下message日志的脚本

 #!/bin/bash
#清除日志脚本,版本2
LOG_DIR=/var/log
ROOT_UID= #$uid为0的时候,用户才具有root用户的权限
#要使用root用户来运行
if ["$UID" -ne "$ROOT_UID"]
then
echo "Must be root to run this script . "
exit
fi
cd $LOG_DIR || { #如果cd没有执行成功就执行大括号中的内容
echo "Cannot change to nessarg directory " >&
exit
}
cat /dev/null > messages
echo "Logs cleaned up"
exit
#退出之前0表示成功,返回1表示失败

清空日志的三种方法

 echo >test.log #输入空的内容
>test.log
cat /dev/null > test.log #查看黑洞,将黑洞重定向到文件
应用:保留文件,清空内容

3、Shell程序在运维工作中的作用地位

Shell脚本很擅长处理纯文本类型的数据,而linux中几乎所有的配置文件、日志文件(如nfs 、rsync、httpd、nginx、lvs等)都是纯文本类型的文件,因此,如果学好Shell脚本语言,就可以利用它在Linux系统中发挥巨大的作用

下面是Shell脚本在运维工作中的作用地位形象图:

4、脚本语言的种类

1)shell脚本语言的种类

在unix/linux中主要有两大类shell

Bourse shell(sh ksh bash)

Bourne shell (sh)

Korn shell(ksh)

Bourne Again shell(bash)

POSIX shell (sh)

C shell(csh tcsh)

C shell (csh)

TENEX/TOPS C shell (tcsh)

Shell脚本语言是弱类型语言,较为通用的shell有标准的Bourne shell 和C shell。其中Bourne shell已经被bash shell取代。

2)Shell脚本与php,perl、python语言的差别?

shell的优势在于处理操作系统底层的业务。可以结合大量的linux命令和函数来执行。一键安装、报警脚本、常规的业务应用,shell开发更简单快速。

php,python优势在于开发运维工具,web界面的管理工具。

5、常用操作系统的默认shell

linux/是Bourne Again shell(bash)

Solaris和FreeBSD缺省的是Bourse shell(sh)

AIX下是Korn Shell(ksh)

HP-UX缺省的是POSIX shell(sh)

Centos linux中的shell类型是(bash)

查看方式:1.echo $SHELL

2、grep root /etc/passwd

二、建立规范的shell脚本

shell脚本的建立:

shell脚本通常是在编辑器(vi vim)中编写,由Unix/Linux命令、bash shell命令、程序结构控制语句和注释内容组成

脚本开头(第一行)

一个规范的shell脚本的第一行会指出程序(解析器)来执行脚本中的内容,在linux bash编程中一般为:

#!/bin/bash 或者#!/bin/sh

#!又称为幻数,在执行bash脚本的时候,内核会根据它来确定该用哪个程序来解释脚本中的内容,这一行必须在脚本顶端的第一行,如果不是第一行则为注释。

 #!/bin/bash

 echo "test start"

 #!/bin/bash

 #!/bin/sh

 echo "test end"

以下为linux中常用脚本语言开头的编码写法,不同语言脚本的开头一般都要加上如下相应语言的标识内容:

  • #!/bin/sh
  • #!/bin/bash
  • #!/usr/bin/awk
  • #!/bin/sed
  • #!/usr/bin/tcl
  • #!/usr/bin/expect
  • #!/usr/bin/perl
  • #!/usr/bin/env python

如果脚本抬头不指定解释器,那么,就要用对应的解释器来执行脚本,例如:bash test.sh

脚本注释

在shell脚本中,跟在(#)后面内容表示注释,用来对脚本进行注释说明,注释部分不会被执行,仅仅是给人看的,注释可自成一行,也可以跟在脚本命令后面与命令同在一行,开发脚本时,如果没有注释,其他人就很难理解脚本究竟在做什么,时间久了自己也会忘记。

shell脚本的执行:

当shell脚本以非交互的方式运行时,它会先查找环境变量ENV,该变量指定了一个环境变量(通常是.bashrc)然后从环境变量文件开始执行,当读取了ENV文件后,SHELL才开始执行shell脚本中内容。

【Shell脚本编程系列】知识储备以及建立规范的脚本的更多相关文章

  1. SHELL脚本编程基础知识

    SHELL脚本编程基础知识 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. Linux之父Linus有一句话很经典:"Talk is cheap, show me the ...

  2. (C#)Windows Shell 外壳编程系列8 - 同后缀名不同图标?

    原文 (C#)Windows Shell 外壳编程系列8 - 同后缀名不同图标? (本系列文章由柠檬的(lc_mtt)原创,转载请注明出处,谢谢-) 接上一节:(C#)Windows Shell 外壳 ...

  3. (C#)Windows Shell 外壳编程系列9 - QueryInfo 扩展提示

    原文 (C#)Windows Shell 外壳编程系列9 - QueryInfo 扩展提示 (本系列文章由柠檬的(lc_mtt)原创,转载请注明出处,谢谢-) 接上一节:(C#)Windows She ...

  4. (C#)Windows Shell 外壳编程系列7 - ContextMenu 注册文件右键菜单

    原文 (C#)Windows Shell 外壳编程系列7 - ContextMenu 注册文件右键菜单 (本系列文章由柠檬的(lc_mtt)原创,转载请注明出处,谢谢-) 接上一节:(C#)Windo ...

  5. (C#)Windows Shell 外壳编程系列6 - 执行

    原文(C#)Windows Shell 外壳编程系列6 - 执行 (本系列文章由柠檬的(lc_mtt)原创,转载请注明出处,谢谢-) 接上一节:(C#)Windows Shell 外壳编程系列5 - ...

  6. (C#)Windows Shell 外壳编程系列5 - 获取图标

    (本系列文章由柠檬的(lc_mtt)原创,转载请注明出处,谢谢-) 接上一节:(C#)Windows Shell 外壳编程系列4 - 上下文菜单(iContextMenu)(二)嵌入菜单和执行命令 有 ...

  7. (C#)Windows Shell 外壳编程系列4 - 上下文菜单(iContextMenu)(二)嵌入菜单和执行命令

    (本系列文章由柠檬的(lc_mtt)原创,转载请注明出处,谢谢-) 接上一节:(C#)Windows Shell 外壳编程系列3 - 上下文菜单(iContextMenu)(一)右键菜单 上一节说到如 ...

  8. (C#)Windows Shell 外壳编程系列2 - 解释,从“桌面”开始展开

    (本系列文章由柠檬的(lc_mtt)原创,转载请注明出处,谢谢-) 接上一篇:(C#)Windows Shell 外壳编程系列1 - 基础,浏览一个文件夹 让我们详细解释一下 Shell 编程中最基本 ...

  9. (C#)Windows Shell 外壳编程系列3 - 上下文菜单(iContextMenu)(一)右键菜单

    (本系列文章由柠檬的(lc_mtt)原创,转载请注明出处,谢谢-) 接上一节:(C#)Windows Shell 外壳编程系列2 - 解释,从“桌面”开始展开 这里解释上一节中获取名称的方法 GetD ...

随机推荐

  1. chrome 下改动 agent 的方法

    前言 这篇文章和 tiankonguse 的个人站点里的文章保持同步. 非常早之前,在 chrome 下改动 agent 的方法是使用 chrome 插件. 后来 chrome 的某一个版本号中自带这 ...

  2. 有空研究一下 superwebsocket (底层是 supersocket) 用来实现 web聊天什么的

    参考:http://superwebsocket.codeplex.com/ 一个老外写的 asp.net 下socket的多钟方案推荐 :http://www.codeproject.com/Art ...

  3. python的动态加载机制??

    if __name__ == '__main__': import sys from PyQt5.QtWidgets import QApplication app = QApplication(sy ...

  4. bootstrapValidator 表单验证

    官网下载地址:http://plugins.jquery.com/bootstrapValidator/ html代码 <!DOCTYPE html> <html> <h ...

  5. 条理清晰的搭建SSH环境之整合Hibernate和Spring

    上篇博客整合了Struts和Spring,感觉很简单,这篇博客主要讲述Hibernate和Spring的整合. 如果说上篇博客中的整合是以为Spring的IOC可以管理对象,让Struts2里的对象管 ...

  6. QT QTransform与QMatrix 有啥区别?

    刚开始学习QT,我使用的是QT5.12进行开发,要不时地查阅QT的官方帮助文档~ 仔细阅读QT官方帮助QTransform类以及QMatrix类,发现两个类的作用描述一模一样(“The QTransf ...

  7. teamviwer安装提示 Verification of your Teamviewer version failed!.

    打开cmd输入 regsvr32 c:\windows\SysWOW64\wintrust.dll 就可以了.

  8. 马尔科夫链蒙特卡洛(Markov chain Monte Carlo)

    (学习这部分内容大约需要1.3小时) 摘要 马尔科夫链蒙特卡洛(Markov chain Monte Carlo, MCMC) 是一类近似采样算法. 它通过一条拥有稳态分布 \(p\) 的马尔科夫链对 ...

  9. [Algorithm] Beating the Binary Search algorithm – Interpolation Search, Galloping Search

    From: http://blog.jobbole.com/73517/ 二分检索是查找有序数组最简单然而最有效的算法之一.现在的问题是,更复杂的算法能不能做的更好?我们先看一下其他方法. 有些情况下 ...

  10. js中的string.format

    String.prototype.format = function(args) { var result = this; if (arguments.length > 0) { if (arg ...