• shell脚本简介


    什么是shell


    shell
    是一个命令解释器,它在操作系统的最外层,负责直接与用户对话,把用户的输入解释给操作系统,并处理各种各样的操作系统的输出结果,输出到屏幕返回给用户。这种对话方式可以是交互的方式(从键盘输入命令,可以立即得到shell的回应),或非交互(执行脚本程序)的方式。
    下图的黄色部分就是命令解释器shell处于的操作系统中位置形象图解。

     

    什么是shell脚本?


    linux命令或语句不在命令下执行(严格说,命令行执行的语句也是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:ak"%date%".sql
    rar.exe a -k -r -s -ml D:ak"%date%".sql.rar D:ak"%date%".sql
    del D:ak*.sql
    rar.exe a -k -r -s -ml D:ak"%date%"htdocs.rar D:workhtdocs
    示例1:清除/var/logmessages日志文件的简单命令脚本。
    #
    把所有命令放在一个文件里堆积起来就形成了脚本,下面是一个最简单的命令堆积形成的shell脚本
    #root
    身份运行
    #
    清楚日志
    cd /var/log
    cat /dev/null > messages
    echo "Logs cleaned up."
    上述脚本存在如下问题:
    1
    、如果不是root用户无法执行清理日志。
    2
    、无流程控制语句,没有判断和逻辑。
    示例2:包含命令、变量和流程控制语句的清除/var/logmessages日志文件的shell脚本。
    #!/bin/bash
    #
    清除日志脚本
    LOG_DIR=/var/log
    ROOT_UID=0 #$UID
    0的时候,用户才具有root用户的权限
    #
    使用root运行
    if [ "$UID" -ne "$ROOT_UID" ]
    then
    echo "Mast be root to run this script."
    exit 1
    fi
    cd $LOG_DIR || {
    echo "Cannot change to necessary directory." >&2
    exit 1 
    }
    cat /dev/null > messages && echo "Logs cleaned up."
    exit 0
    #
    退出之前返回0表示成功,返回1表示失败。
    拓展:清空日志及文件内容的三种方法。
    [root@lamp ~]# echo >test.log
    [root@lamp ~]# >test.log 
    [root@lamp ~]# cat /dev/null > test.log 

    shell脚本在运维工作中的地位


    shell
    脚本很擅长处理纯文本类型的数据,而linux系统中几乎所有的配置文件(如nfsrsynchttpdnginxlvs等)、多数启动文件都是纯文本类型的文件。因此利用shell可以在linux系统中发挥巨大作用。

    shell脚本语言的种类


    UNIX/LINUX中主要有两大类shell
    Bourne shell
    包括shkshbash
    Bourne shell
    sh
    Korn shell
    ksh
    Bourne Again shell
    bash
    POSIX shll
    sh
    C shell
    包括cshtcsh
    C shell
    csh
    TEXES/TOPS C shell
    tcsh
    shell
    脚本语言是若类型语言,较为通用的shell有标准的Bourne shellsh)和C shellcsh)。其中Bource shellsh)已经被bash shell取代。
    查看系统的shell
    [root@lamp ~]# cat /etc/shells
    /bin/sh
    /bin/bash #
    功能更强大
    /sbin/nologin
    /bin/dash
    /bin/tcsh
    /bin/csh

    常用操作系统的默认shell


    Linux
    bourne agaion shellbash)。
    Solaris
    FreeBSD缺省的是Bourne shllsh)。
    AIX
    下是korn shellksh)。
    HP-UX
    缺省的是POSIX shellsh)。
    查看CentOS默认shell
    第一种方法。
    [root@lamp ~]# echo $SHELL
    /bin/bash
    [root@lamp ~]# echo $shell
    bash
    第二种方法。
    [root@lamp ~]# grep root /etc/passwd
    root:x:0:0:root:/root:/bin/bash
    operator:x:11:0:operator:/root:/sbin/nologin
    更改默认的shell配置文件。
    [root@lamp ~]# cat /etc/default/useradd 
    # useradd defaults file
    GROUP=100
    HOME=/home
    INACTIVE=-1
    EXPIRE=
    SHELL=/bin/bash
    SKEL=/etc/skel
    CREATE_MAIL_SPOOL=yes

    shell脚本的建立和执行


    shell
    脚本的建立。
    linux系统中,shell脚本(bash shll程序)通常是在编辑器(如vi/vim)中编写,由Unix/Linux命令、bash shell命令、程序结构控制语句和注释等内容组成,推荐使用vim编辑器编写,可以事先做一个别名alias vi='vim'
    [root@lamp ~]# echo "alias vi='vim'" >>/etc/profile
    [root@lamp ~]# tail -n 1 /etc/profile
    alias vi='vim'
    [root@lamp ~]# source /etc/profile
    [root@lamp ~]# . /etc/profile
    脚本开头(第一行)
    一个规范的shell脚本在脚本第一行会指出由哪个程序(解释器)来执行脚本中的内容,这一行内容在linux bash编程中一般为:
    #! /bin/bash

    #! /bin/sh <==255
    个字符以内
    其中开头的"#!"字符又称为幻数,在执行bash脚本的时候,内核会根据"#!"后的解释器来确定该用哪个程序解释这个脚本的内容。注意,这一行必须在每个脚本顶端的第一行,如果不是第一行则为脚本注释行,例如下面的例子。
    不加上诉第一行,默认就会使用linux默认的shell
    [root@lamp ~]# cat test.sh 
    #!/bin/bash
    echo "shell start"
    #!/bin/bash #
    写到这里表示注释
    #!/bin/sh
    echo "shell end"
    sh
    bash的区别,早期的bashsh稍有不同,它还包含了cshksh的特色,但大多数脚本都可以不加修改的在sh上运行。
    [root@lamp ~]# ll /bin/sh
    lrwxrwxrwx. 1 root root 4 Mar 10 2017 /bin/sh -> bash
    [root@lamp ~]# ll /bin/bash 
    -rwxr-xr-x. 1 root root 941944 Jan 12 2017 /bin/bash
    sh
    bash的软连接,推荐用标准写法#!/bin/bash
    注意,当使用/bin/sh执行脚本不正常的时候,可以使用/bin/bash执行。
    bash
    的版本
    [root@lamp ~]# bash -version
    GNU bash, version 4.1.2(2)-release (x86_64-redhat-linux-gnu)
    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.
    脚本注释
    shell脚本中,跟在(#)井号后面的内容表示注释,用来对脚本进行注释说明,注释部分不会被当做程序执行,仅仅是给用户看,系统解释器是看不到的,更不会执行。注释可自成一行,也可以跟在脚本命令后面与命令在同一行。开发脚本时,如果没有注释,团队里的其他人就很难理解脚本究竟在做什么,如果时间上了自己也会忘记。因此,我们要尽量养成为所开发的shell脚本书写注释的习惯。注释书写注意规范性,尽量不用中文。
    shell
    脚本的执行
    shell脚本运行时,它会先查找系统环境变量ENV,该变量指定了环境文件(通常是.bashrc.bash_profile/etc/bashrc/etc/profile等),然后从该环境变量文件开始执行脚本,当读取了ENV的文件后,shell会开始执行shell脚本中的内容。
    特殊技巧:设置crond任务时,最好把系统环境变量在定时任务脚本中重新定义,否则,一些系统环境变量将不会被加载。
    shell
    脚本的执行通常可以采用以下几种方式:
    1
    bash script-namesh script-name(推荐使用)。
    2
    path/script-name./script-name(当前路径下执行脚本,需要脚本有执行权限)。
    3
    source script-name. scripts-name"."点号)。
    4
    sh<script-namecat script-name|sh(同样适合bash)。
    执行说明
    第一种方法是当脚本文件本身没有可执行权限(即文件x位为-号)时常使用的方法,或者文件开头没有指定解释器。
    第二种方法需要先将脚本文件的权限改为可执行(即文件加X位),具体方法:chmod u+x script-namechmod 755 script-name。然后通过脚本路径就可以直接执行脚本。
    第三种放法通常是使用source"."点号读入或加载指定的shell脚本文件(如test.sh),然后,依次执行指定shell脚本文件test.sh中的所有语句。
    举例说明:
    [root@lamp ~]# cat >test.sh
    echo 'i am shell'
    输入"echo 'i am shell'"内容后按回车,然后再按ctrl+d组合键即可结束编辑。
    1
    )通过第一种方法执行
    [root@lamp ~]# cat test.sh 
    echo 'i am shell'
    [root@lamp ~]# sh test.sh 
    i am shell
    [root@lamp ~]# bash test.sh 
    i am shell
    2
    )通过第二种方法执行
    [root@lamp ~]# ll test.sh 
    -rw-rw-r--. 1 root root 18 Jul 24 23:20 test.sh
    [root@lamp ~]# ./test.sh #
    使用第二种方式,"./"在当前目录下执行test.sh脚本文件,无法使用tab自动补全
    -bash: ./test.sh: Permission denied 
    test.sh添加可执行权限。
    [root@lamp ~]# chmod u+x test.sh 
    [root@lamp ~]# ./test.sh 
    i am shell
    3
    )通过第三种方法执行
    [root@lamp ~]# . test.sh 
    i am shell
    [root@lamp ~]# source test.sh 
    i am shell
    4
    )通过第四种方法执行
    [root@lamp ~]# sh <test.sh 
    i am shell
    [root@lamp ~]# cat test.sh|bash
    i am shell
    案例:已知如下命令及返回结果,请问echo $user的返回结果为()。
    [root@lamp ~]# cat test.sh 
    user=`whoami`
    [root@lamp ~]# sh test.sh
    [root@lamp ~]# echo $user
    答案:空。
    [root@lamp ~]# . test.sh 
    [root@lamp ~]# echo $user
    答案:root 
    结论:1、子shell会直接继承父shell的变量、函数等。2、如果希望父shell调用子shell的变量、函数等,用source"."点号执行脚本。
    shell
    脚本开发的基本习惯
    1
    )脚本第一行指定脚本解析器。
    #!/bin/sh
    #!/bin/bash
    2
    )脚本开头加版本版权等信息
    #Date
    07:00 2018-07-26
    #Mail
    xxxxx@xxx
    #Author
    Created by golden
    #Function
    This scripts function is ...
    #Version
    1.3
    提示:可以配置vim编辑文件时自动加上以上信息,方法是修改~/.vimrc配置文件。
    3
    )脚本中不用中文注释
    尽量用英文注释,防止本机或切换系统环境后中文乱码的困扰。
    4
    )脚本以.sh为扩展名命名。
    5
    )代码书写优秀习惯技巧
    1
    、成对的符号内容尽量一次写出来,防止遗漏。
    2
    "[]"中括号两端要有空格,书写时即可留出空格[ ],然后在退格书写内容,先书写一对中括号,然后退一格,然后在输入两个空格,再退一格。 双中括号"[[]]"也是如此。
    3
    、流程控制语句一次书写完,在添加内容。
    if
    语句格式一次完成。
    if
    条件内容
    then
    内容
    fi
    for
    循环格式一次完成。
    for
    do
    内容
    done
    6
    )通过缩进让代码更易读。

  • 相关阅读:
    Java 使用对话框选择文件并输出到控制台
    Java 数组 可变长参数 实例
    Java 返回一个整数的各个数字之和的一种方法
    weblogic控制台部署web项目图解
    合理的饮食+适当的运动=健康的身体
    Linux远程管理器xshell和xftp使用教程,以及遇到关闭Xshell后项目也停止的解决方法
    java使用freemarker 生成word文档
    MyEclipse 2014优化设置(禁用myeclipse updating indexes)
    ORACLE中查询被锁定的表,以及如何解锁
    MySql查询优化
  • 原文地址:https://www.cnblogs.com/yinshoucheng-golden/p/9369603.html
Copyright © 2020-2023  润新知