zoukankan      html  css  js  c++  java
  • 01 Shell脚本编程入门知识

    Linux Shell语言使用背景
      目前全球正处于“互联网+”的时代,各行各业都与互联网挂钩,比如互联网+教育、互联网+销售等等。几乎所有的商品、服务网上都能找得到,而支撑互联网的幕后支柱就是Linux系统。Linux运维技术成为IT技术人员的必备技能。
      想要降低Linux运维成本就要进行运维自动化,进行自动化就需要脚本语言。时下Linux系统最流行的脚本语言就是Shell和Python。Python的流行时间短,学习成本高。而Shell几乎是所有运维公司都必须使用的自动化语言,在很多工作环节中必不可少。
      学习Shell编程最好有相关基础,比如vim编辑器、SSH终端、Linux命令(重点掌握正则表达式和grep、sed、awk命令)、Linux网络部署、日志分析排错、网络服务等。
    常见网络服务类型:Crond、Rsync、Inotify、Nginx、PHP、MySQL、Keepalived、Memcached、Redis、NFS、Iptables、SVN、Git等。

    其他脚本语言
      PHP网页程序语言。Perl语言(已成为历史)。python。

    Linux命令在Shell编程中的作用
      每种语言都有自带的函数库,唯独Shell没有,Shell使用Linux命令,可以把Linux命令看作是Shell的函数库。

    什么是Shell
    定义:Shell是Linux/Unix命令解释器,负责将命令翻译给Linux系统内核并返回运算结果,是人机交互的中介接口。
    Shell分类:命令行Shell(CLI Shell),图形化Shell(GUI Shell)。图形化Shell就是用鼠标点点点,有桌面界面的那种。命令行Shell类似于windows中的Dos。
    命令行Shell分类:主要有两大类,B Shell系列和C Shell系列,B Shell用于Linux系统,C Shell用于Unix系统。
    B Shell分类:包括Bourne Shell(sh)、Korn Shell(ksh)、Bourne Again Shell(bash)三种类型。重点掌握bash,它是各种Linux发行版系统默认的Shell,是目前主流Linux Shell。bash集合了ksh和sh的优点,而ksh是由sh发展出来的。
      C Shell又包括csh、tcsh两种类型。tcsh是csh的增强版,已运用于苹果电脑MAC系统,但目前通用的还是csh。
    一个系统可以储存了多个CLI Shell,CentOS 6查看系统有哪些Shell可以使用命令:cat /etc/shells

    命令执行方式分类

      交互式、批量式。(交互式就是一次只能输入一条命令,机器返回对应结果,再输入一条命令再返回一次结果。批量式就是一次写一整套脚本命令,然后机器一次性执行完。命令行Shell中使用Linux命令的执行方式就是交互式,而Shell脚本当然是使用批量式执行)

    什么是Shell脚本
    定义:Shell脚本是采用某种Linux Shell对应的命令以及操作语句编写的Linux系统批量操作程序。
    (windows中用Dos解释器写的批量操作文件是.bat文件)
    (Linux中用Shell解释器写的批量操作文件就是Shell脚本,后缀为.sh)
    (所有编程语言都是由库函数和语句组成,而语句又由关键字和变量组成。至于表达式,不算在语言范畴中,比如1+2谁都能运行,属于哪门语言?)
    Shell脚本内容:和其他计算机语言类似,Shell脚本语言包括两部分,Linux命令和控制语句。而控制语句又包括变量定义语句、赋值语句、输入/输出语句、分支语句、循环语句。
    Shell脚本语言:是一种弱类型,解释型语言。
    Shell脚本语言优势:与系统更兼容,命令多,适合处理偏系统底层业务。简单、易用、高效。

    Shell脚本建立和执行
    给vim编辑器起别名
      编辑器有vi和vim,推荐使用vim。
      在终端中给vim编辑器起个永久别名叫vi,分别输入以下两条命令:

    echo "alias vi='vim'" >>/etc/profile
    source /etc/profile
    脚本的第一行
      终端使用命令cat 路径可以编辑对应文件,添加单行代码。enter后自动保存。或者vi别名打开vim编辑器开始写脚本。
      一般脚本的第一行是用来指定用哪个Shell来执行脚本的。选择输入下面任意一行代码指定使用哪个Shell。

    #!/bin/bash
    #!/bin/sh
    #!/usr/bin/awk
    #!/bin/sed
    #!/usr/bin/tcl
    #!/usr/bin/expect
    #!/usr/bin/perl
    #!/usr/bin/env python
      其中expect是交互式语言解释器,perl是perl语言解释器,env python是python解释器。
      如果第一行不指定Shell,系统默认使用bash,为了规范,请指定Shell。
      如果想让脚本在多种Shell上运行,第一行可以不指定Shell。运行时先进入对应的Shell,在Shell中打开脚本,这样也可以。
      #!字符又称幻数,内核会读取#!后的路径选择Shell。
      为什么一定要在第一行写?我们都知道#后面的内容是注释,第一行除外,所以幻数必须放在脚本顶端第一行,若上面代码放在其他行则无效,变成注释。
      附:查看bash版本。终端输入:

    bash --version
      检测bash是否有漏洞。终端输入:

    env x='() { :;}; echo be careful' bash -c "echo this is a test"
      若显示be careful this is a test,则需要升级bash。升级方法是分别输入下面两条命令:

    yum -y update bash
    rpm -qa bash
      若没有显示be careful,不需要升级bash。

    执行脚本。
      方法一(推荐方法):终端输入命令“Shell名 脚本名”,比如

    bash script_name
      使用这种方法不仅指定了Shell,也避免了脚本没有执行权限的问题。

      方法二是终端输入命令“路径/脚本名或 ./脚本名”。路径可以是绝对路径或相对路径。
      但这种方法执行的脚本必须要有执行权限。有的人定时运行脚本,结果脚本没有执行权限导致到时间没执行,造成重大损失。
    给脚本添加执行权限使用命令:

    chmod +x 脚本名
      方法三是“source 脚本名” 或“. 脚本名”,点后要有空格。
      source或点方法不同于其他方法。方法一、二(Shell和路径)运行脚本系统会开启一个新的Shell进程,执行完就关闭脚本文件,脚本数据不会留在原Shell进程上。
      而使用source和点执行的脚本不会开启新的进程,直接在当前Shell终端进程中执行,执行完后关闭文件但不关闭当前Shell进程,数据依然存在于当前Shell中。
      方法三与方法一、二不同的举例说明(#后是注释):

    [root@andy ~]# cat test.sh #cat命令查看test文件,里面有条输出语句
    echo "userdir=`pwd`"
    [root@andy ~]# bash test.sh #使用“Shell 脚本”的格式执行脚本。
    /home/root #执行成功,输出变量代表的pwd路径
    [root@andy ~]# echo $userdir #此时已执行完毕,尝试再输出变量
    #结果为空
    [root@andy ~]# source test.sh #采用“source 脚本”的格式执行脚本
    /home/root #执行成功
    [root@andy ~]# echo $userdir #此时已执行完毕,尝试再输出变量
    /home/root #再次显示变量内容
      所以,记住source和 . 点方法执行脚本是在当前Shell中进行。执行完后变量都还在Shell中。
      第四种方法是:“sh<脚本名” 或“cat 脚本名|sh”
      这种方法不常用,这是个奇招,有时能少写几个循环,但不标准,不推荐。

      系统执行脚本的过程是先查找环境变量ENV,然后ENV变量依次加载几个环境文件后,开始执行脚本。
      执行顺序:从上到下,从左到右。若执行中遇到子脚本调用语句,则先执行完子脚本,再返回继续执行父脚本。

    Shell脚本开发规范
      第一行指定Shell。
      脚本开头加版本、版权等信息。
      尽量不使用中文。
      脚本文件的后缀名是 .sh。
      脚本文件保存在固定的路径下,如 /server/scripts。

    书写技巧:
      成对的符号先打出来再在里面添加内容。
      流程控制语句先写完格式,再添加内容。
      适当使用缩进使代码易读。
      常规字符串用双引号,强引用用单引号,引用命令用反引号。

  • 相关阅读:
    struts2 文件上传
    struts2 前端显示错误信息
    struts2
    struts2 针对类型转换出错的处理
    Beats:使用filebeat传送多行日志multiline
    logstash的output插件
    logstash的mutate插件
    logstash中date的时间处理方式总结
    logstash更新gem源
    logstash的Multiline插件
  • 原文地址:https://www.cnblogs.com/Nonstopcoding/p/11183100.html
Copyright © 2011-2022 走看看