zoukankan      html  css  js  c++  java
  • SHELL (1) —— shell脚本入门

    摘自:Oldboy Linux运维——SHELL编程实战

    SHELL

    Shell是一个命令解释器,解释执行用户输入的命令及程序等,用户每输入一条命令,Shell就解释执行一条。这种从键盘以输入命令,就可以立即得到回应的对话方式,称为交互的方式。

    Shell存在于操作系统的最外层,负责与用户直接对话,把用户的输入解释给操作系统,并处理各种各样的操作系统的输出结果,然后输出到屏幕返回给用户。输入系统用户名和密码并登录到Linux后的所有操作都是由Shell解释与执行的。

    命令、变量和流程控制语句等有机地结合起来,就形成了一个功能强大的Shell脚本。

    Shell脚本语言是弱类型语言(无须定义变量的类型即可使用),在Unix/Linux中主要有两大类Shell:一类是Bourne shell,另一类是C shell。

    Bourne shell包括Bourne shell(sh)、Korn shell(ksh)、Bourne Again Shell(bash)三种类型。

    C shell包括csh、tcsh两种类型。

    查看CentOS 6.x系统的Shell支持情况:cat /etc/shells

    Linux系统中的主流Shell是bash,bash是有Bourne Shell(sh)发展而来的,同时bash还包含了csh和ksh的特色,但大多数脚本都可以不加修改地在sh上运行,如果使用了sh后发现结果和预期有差异,那么可以尝试用bash替代sh。

    PHP语言的优势在于小型网站系统的开发;Python语言的优势在于开发较复杂的运维工具软件、Web界面的管理工具和Web业务的开发(例如:CMDB自动化运维平台、跳板机、批量管理软件SaltStack、云计算OpenStack软件)等。Shell脚本语言的优势在于处理偏操作系统底层的业务。对于一些常见的系统脚本,使用Shell开发会更简单、更快速。对于一些常规的业务应用,使用Shell更符合Linux运维简单、易用、高效的三大基本原则。

    查看CentOS Linux系统默认的Shell:

    1. echo $SHELL

    2. grep root /etc/passwd

    查看系统的bash版本:

    [root@yeebian ~]# cat /etc/redhat-release 
    CentOS release 6.9 (Final)                  #<==这里显示的是作者写作的Linux的环境版本。
    [root@yeebian ~]# bash -version
    GNU bash, version 4.1.2(2)-release (x86_64-redhat-linux-gnu)
                                                               #<==这里显示的是bash的版本。
    Copyright (C) 2009 Free Software Foundation, Inc.
                                                               #<==下面几行是自由软件提示的相关信息。
    License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
    
    This is free software; you are free to change and redistribute it.
    There is NO WARRANTY, to the extent permitted by law.
    

    检测系统是否存在漏洞:

    [root@yeebian ~]# env x='() { :;}; echo be careful' bash -c "echo this is a test" 
    this is a test
    

    如果返回下面两行,则表示需要尽快升级bash了,特别是企业用户,仅仅是用于学习和测试就无所谓了。

    be careful
    this is a test
    

    升级方法为:

    [root@yeebian ~]#yum -y update bash
    [root@yeebian ~]#rpm -qa bash
    bash-4.1.2-40.el6.x86_64
    

    下面是Linux中常用脚本开头的写法,不同语言的脚本在开头一般都要加上如下标识内容:

    1. #!/bin/sh
    2. #!/bin/bash
    3. #!/usr/bin/awk
    4. #!/bin/sed
    5. #!/usr/bin/tcl
    6. #!/usr/bin/expect            #erpect解决交互式的语言开头解释器
    7. #!/usr/bin/perl              #perl语言解释器
    8. #!/usr/bin/env python        #python语言解释器
    

    如果在脚本开头的第一行不指定解释器,那么就要用对应的解释器来执行脚本,这样才能确保脚本正确执行。例如:

    如果是Shell脚本,就用bash test.sh执行test.sh。

    如果是Python脚本,就用python test.py执行test.py。

    如果是expect脚本,就用expect test.exp执行test.exp。

    Shell脚本的执行

    当Shell脚本运行时,它会先查找系统环境变量ENV,该变量指定了环境文件(加载顺序通常是/etc/profile、~/.bash_profile、~/.bashrc、/etc/bashrc等),在加载了上述环境变量文件后,Shell就开始执行Shell脚本中的内容。

    Shell脚本执行流程如图:

    使用sh执行脚本会导致当前Shell无法获得变量值。

    在Shell脚本中尽量不用中文(不限于注释)。如果非要加中文,请根据自身的客户端对系统进行字符集调整,如:export LANG="zh_CN.UTF-8",并在脚本中重新定义字符集设置,和系统保持一致。

    对于常规变量的字符串定义变量值应加双引号,并且等号前后不能有空格,需要强引用的(指所见即所得的字符引用)则用单引号(''),如果是命令的引用,则用反引号(``)。脚本中的单引号、双引号及反引号必须为英文状态下的符号。

  • 相关阅读:
    Django2.2中Xadmin错误集
    Asp.Net中MVC缓存详解
    【转】通用sqlserver分页存储过程
    用ASP.NET Web API技术开发HTTP接口(二)
    用ASP.NET Web API技术开发HTTP接口(一)
    关于Excel的读取
    前台取得后台返回的json数据!
    .net淘宝客基础api 分页查询
    Educational Codeforces Round 97 (Rated for Div. 2)
    Codeforces Round #668 (Div. 2)
  • 原文地址:https://www.cnblogs.com/vurtne-lu/p/6953537.html
Copyright © 2011-2022 走看看