如何编写一个脚本

shell脚本编程

过程式编程,解释执行,依赖于外部程序文件运行;

脚本是什么:
    命令的堆积;
    但很多命令不具有幂等性,需要用程序逻辑来判断运行条件是否满足;
    
脚本的用途:
    自动化常用命令;
    执行系统管理和故障排除;
    创建简单的应用程序;
    处理文本或文件;

编程语言的分类    
    根据运行方式:
        编译运行:源代码-->编译器(编译)-->程序文件
        解释运行:源代码-->运行时启动解释器,由解释器边解释边运行
    
    根据其编程过程中功能的实现是调用库还是调用外部的程序文件:
        shell脚本编程:
            利用系统上的命令及编程组件进行编程;
        完整编程:
            利用库或编程组件进行编程;
        
        程序编译方式:
            动态链接;
            静态编译;
            
    根据编程模型:
        过程式编程语言;
        面向对象的编程语言;
    
        程序=指令+数据
        过程式:以指令为中心来组织代码,数据是服务于代码;
            顺序执行
            选择执行
                代码只有一个分支时:条件满足时才执行;(if)
                两个或以上的分支,只会执行其中一个满足条件的分支;(case)
            循环执行
            代表:C,bash
        对象式:以数据为中心来组织代码,围绕数据来组织指令;
            类(class):实例化对象,method;
            代表:java,C++,Python
            
程序的组成部分:二进制程序文件、库文件、配置文件、帮助文件;
    二进制、库文件: 可执行文件;
        库文件:不能独立执行,只能被调用时执行;
    配置文件、帮助文件:可被查看的文本文件;
        《穿越计算机的迷雾》、《量子物理史话》
    
    编程语言的基本结构:
        数据存储:变量、数组
        表达式:a+b
        语句:if
        
如何编写shell脚本:
    第一步:使用文本编辑器来创建文本文件;        
        文本编辑器:
        行编辑器:sed
        全屏幕编辑器:nano,vi,vim
        
        第一行顶格:给出shebang,解释器路径,用于指明解释执行当前脚本的解释器程序文件;
        常见的解释器:
            #!/bin/bash
            #!/usr/bin/python
            #!/usr/bin/perl    
            
        添加注释,注释以#开头;
        缩进
        适度添加空白行;
        
        脚本中的空白行会被解释器忽略;
        脚本中除了shebang,余下所有以#开头的行都会被视作注释行而被忽略;
                    
    第二步:执行脚本:
        脚本的运行是通过运行一个子shell进程实现的;
        (1)赋予执行权限,并直接运行此程序文件;在命令行上指定脚本的绝对或相对路径;
            chmod +x /PATH/TO/SCRIPT_FILE
            /PATH/TO/SCRIPT_FILE
                对脚本有rx权限;
                对脚本所在的目录有rx权限;
        
        (2)直接运行解释器,将脚本作为解释器程序的参数运行;
            bash /PATH/TO/SCRIPT_FILE
                对脚本有r权限;
                对脚本所在的目录有rx权限;
                
        (3)点号用于执行某个脚本,甚至脚本没有可执行权限也可以运行;
           如果没有执行权限,用"./"执行就会报权限错误,但是在前面使用点号执行就不会报错;
            #. ./99.sh
            
        (4)souce命令也可以读取并在当前环境中执行脚本,同时还返回脚本中最后一个命令的返回状态;
           如果没有返回值则为0,代表执行成功;如果执行失败则返回false.    
            #source 9.sh    
                            
    1、编写脚本/root/bin/systeminfo.sh,显示当前主机系统信息,包括主机名、IPv4地址、操作系统版本、内核版本、CPU型号、内存大小、硬盘大小;
        vim /root/bin/systeminfo.sh
        #!/bin/bash
        echo "hostname:`hostname`"
        echo "ip address is:`ifconfig eno16777736 | head -2 | tail -1 | tr -s " " | cut -d" " -f3`"
        echo "os release version:`cat /etc/centos-release`"
        echo "kernel version:`uname -r`"
        echo "cpu model:`cat /proc/cpuinfo | grep "model name" | uniq | cut -d: -f2`"
        echo "memery size:`cat /proc/meminfo | grep -i "memtotal" | tr -s " " | cut -d: -f2`"
        echo "disk size:`fdisk -l /dev/sda | head -2 | tail -1 | cut -d: -f2`"
        
    2、编写脚本/root/bin/backup.sh,可实现将/etc/目录备份到/root/etcYYYY-mm-dd中;
        vim /root/bin/backup.sh
        #!/bin/bash
        cp -a /etc /root/etc`date +%F`
        
    3、编写脚本/root/bin/disk.sh,显示当前硬盘分区中空间利用率最大的值;
        vim /root/bin/disk.sh
        #!/bin/bash
        df | tr -s " " | grep "sd" | sort -nr -k5 | head -1 | cut -d" " -f5
        
    4、编写脚本/root/bin/links.sh,显示正连接本主机的每个远程主机的IPv4地址和连接数,并按连接数从大到小排序;
        vim /root/bin/links.sh
        #!/bin/bash
        netstat -tan | tr -s " " | cut -d" " -f5 | grep -v ".*[[:alpha:]]\+.*" | uniq -c | sort -r -k1
        或者netstat -tan | tr -s " " | cut -d" " -f5 | tail -n +3 | uniq -c | sort -r    
        
    5、写一个脚本,实现如下功能:
       (1)显示/etc/目录下所有以大写P或小写p开头的文件或目录本身;
       (2)显示/var/目录下的所有文件或目录本身,并将显示结果中的小写字幕转换为大写字母后显示;
       (3)创建临时文件/tmp/myfile.XXXX;
        vim test.sh
        #!/bin/bash
        ls -d /etc/[Pp]*
        ls -d /var/* | tr ‘a-z‘ ‘A-Z‘            
        mktemp /tmp/myfile.XXXX            
        chmod +x test.sh    
        
read命令:用户交互;
    从键盘读入数据,赋给变量或数组;
    read -p "Enter a filename:" FILE    
        -p ‘promt‘ 给变量赋值;在尝试读取之前,输出PROMPT提示符,并且不换行;
        -t TIMEOUT 超时;
        -a array 给数组赋值;
    
        read -t 5 -p "Enter a username: " name
        [ -z "$name" ] && name="obama"
        echo $name    
        
shift:向左移动位置参数;
    shift[n]:位置参数轮替;向左移动位置参数;
    假设脚本有A,B,C三个参数,那么$1为A,$2为B,$3为C;shift一次之后,$1为B,$2为C;再shift一次后,$1为C...    
    vim shift.sh
    #!/bin/bash
    echo "First pos argu: $1"
    shift
    echo "Second pos argu: $1"
    
exit:退出本次登录;
    在脚本中,exit代表退出当前脚本;可以跟一个数字参数,代表退出状态;
    
break:
    跳出循环;从一个循环(for,while,until,select)中退出;
    break后面可以跟一个数字n,代表跳出n层循环,n必须大于1,如果n比当前循环层数还大,则跳出所有循环;
    break: only meaningful in a ‘for‘, ‘while‘, or ‘until‘ loop
    vim break01.sh
    #!/bin/bash
    for I in A B C D
    do
        echo -n "$I:"
        for J in `seq 10`
        do
            if [ $J -eq 5 ];then
                break
            fi
            echo -n " $J"
        done
        echo
    done
    当J值为5时,break的输出结果:(循环了4次)
    A: 1 2 3 4
    B: 1 2 3 4
    C: 1 2 3 4
    D: 1 2 3 4
            
    vim break02.sh
    #!/bin/bash
    for I in A B C D
    do
        echo -n "$I:"
        for J in `seq 10`
        do
            if [ $J -eq 5 ];then
                break 2
            fi
            echo -n " $J"
        done
        echo
    done
    echo
    当J值为5时,break 2的输出结果:(循环了1次)
    A: 1 2 3 4
    
continue:
    结束当前循环而进入下一次循环;
    continue后面还可以跟一个数字n,代表跳至外部第n层循环,n必须大于1,如果n比当前循环层数还大,将跳至最外层的循环;
    和break不同的是,continue不会终止整个循环体,它只是提前结束本次循环;而整个循环体还将继续执行;
    continue: only meaningful in a ‘for‘, ‘while‘, or ‘until‘ loop
    vim continue.sh
    #!/bin/bash
    for I in A B C D
    do
        echo -n "$I:"
        for J in `seq 10`
        do
            if [ $J -eq 5 ];then
                continue
            fi
            echo -n " $J"
        done
        echo
    done
    当J值为5时,continue的输出结果:
    A: 1 2 3 4 6 7 8 9 10
    B: 1 2 3 4 6 7 8 9 10
    C: 1 2 3 4 6 7 8 9 10
    D: 1 2 3 4 6 7 8 9 10
    
    vim continue.sh
    #!/bin/bash
    for I in A B C D
    do
        echo -n "$I:"
        for J in `seq 10`
        do
            if [ $J -eq 5 ];then
                echo
                continue 2
            fi
            echo -n " $J"
        done
        echo
    done
    当J值为5时,continue 2的输出结果:
    A: 1 2 3 4
    B: 1 2 3 4
    C: 1 2 3 4
    D: 1 2 3 4
    
    #!/bin/bash
    while true
    do
        read -p "Select 1 or 2: " num
        echo 1
        sleep 1
        if [ $num -eq 1 ];then
            continue
        fi
        echo 2
    done

#/bin/bash
    while true
    do
        read -p "Select 1 or 2: " num
        echo 1
        sleep 1
        if [ $num -eq 1 ];then
            break
        fi
        echo 2
    done
    echo 3

时间: 2024-10-27 00:04:20

如何编写一个脚本的相关文章

使用shell编写一个脚本,磁盘超过80%邮件报警

方法1: 监控磁盘或CPU超过一定值邮件报警脚本: [[email protected] scripts]# cat check.sh #!/bin/bash LANG=en_US.UTF-8 cpuUsed=`top -n 1|awk -F '[, %]+' 'NR==3 {print100-$11}'` diskUsed=$(df -h|awk -F '[ %]+'  '/\/$/{print $5}') logFile=/tmp/jk.log function Sendmail(){ ma

转:Shell 编程--本文结合大量实例阐述如何编写一个shell脚本

转自:情報官世界 本文结合大量实例阐述如何编写一个shell脚本. 为什么要进行shell编程 在Linux系统中,虽然有各种各样的图形化接口工具,但是sell仍然是一个非常灵活的工具.Shell不仅仅是命令的收集,而且是一门非常棒的编程语言.您可以通过使用shell使大量的任务自动化,shell特别擅长系统管理任务,尤其适合那些易用性.可维护性和便携性比效率更重要的任务. 下面,让我们一起来看看shell是如何工作的: 建立一个脚本 Linux中有好多中不同的shell,但是通常我们使用bas

工程师技术(五):Shell脚本的编写及测试、重定向输出的应用、使用特殊变量、编写一个判断脚本、编写一个批量添加用户脚本

一.Shell脚本的编写及测 目标: 本例要求两个简单的Shell脚本程序,任务目标如下: 1> 编写一个面世问候 /root/helloworld.sh 脚本,执行后显示出一段话"Hello World!!"   2> 编写一个能输出系统信息的 /root/sysinfo 脚本,执行后依次输出当前红帽系统的版本信息.当前使用的内核版本.当前系统的主机名 方案: 规范Shell脚本的一般组成: 1> #! 环境声明(Sha-Bang)    2> # 注释文本 

使用if语句编写Shell脚本

在简单的shell脚本程序中,各条语句将按先后顺序依次执行,从而实现批处理的自动化过程.然而,单一的顺序结构使得脚本不够智能,难以处理更加灵活的系统任务.通过正确的使用if语句,使得shell脚本具有一定的判断能力,以根据不同的条件来完成不同的任务管理. 条件测试操作 要使shell脚本具有一定的智能,就必须使其区分在不同的条件下执行哪种操作.例如,当磁盘使用率超过95%时发送告警消息等 可使用专门的测试工具test命令,对特定的条件进行测试,并根据返回值($?)来判断条件是否成立,返回值为0表

跟着老刘学《Linux就该这么学》第五天--编写Shell脚本

编写Shell脚本可以将Shell终端解释器当作人与计算机硬件之间的"翻译官",它作为用户与Linux系统内部的通信媒介,除了能够支持各种变量与参数外,还提供了诸如循环.分支等高级编程语言才有的控制结构特性.要想正确使用Shell中的这些功能特性,准确下达命令尤为重要.Shell脚本命令的工作方式有两种:交互式和批处理. 交互式(Interactive):用户每输入一条命令就立即执行. 批处理(Batch):由用户事先编写好一个完整的Shell脚本,Shell会一次性执行脚本中诸多的命

在ubuntu linux 中编写一个自己的python脚本

在ubuntu linux 中编写一个自己的简单的bash脚本. 实现功能:终端中输入简单的命令(以pmpy为例(play music python),为了区别之前说的bash脚本添加了py后缀),来实现音乐的播放.注:本人ununut中安装了audacious,所以就以audacious为例,来实现音乐的播放. 第一步:进入一个目录,最好是自己特别选定的,如果用文件浏览器可以新建一个名为pmpy空白文档文件:如果是用终端可以输入命令:vi pmpy(可能会因为位置问题,需要添加sudo) 第二

使用shell编写一个检测系统参数的脚本

检测os的脚本 目的:学了shell语言后,根据已学编写一个shell的脚本实现检测部分系统参数实现邮件告警, (之前刚刚学习写的不怎么完善和实用!) [[email protected] scripts]# cat os.monitor.sh #!/bin/bash ########### #name=linux查看系统资源脚本 #auth=cml #time:2015 ########### DATE=`date "+%F %H:%M:%S"` HOST=`hostname` ##

编写一个BAT脚本协助运维人员遇到问题时候调测数据库是否有效连接成功的操作攻略

简单摘要: 1.内网系统出现故障需要排查 2.运维人员不熟悉数据库操作,没法通过连接数据库和执行SQL语句的方式排查数据库及数据是否正常 3.解决方案:编写一个bat脚本,运维人员双击运行即可.   原文链接: http://www.lookdaima.com/WebForms/WebPages/Blanks/Pm/Docs/DocItemDetail.aspx?id=d861e977-87d1-4ac0-ab63-91dacb9ccc9e 背景说明: 车辆管理系统涉及2台服务器: 101:数据

编写shell脚本不停地telnet一个ip或域名,并输出结果到文件中

编写shell脚本不停地telnet一个域名,并输出结果到文件中 [[email protected] ~]# cat telnetscript.sh #!/bin/bash #检查是否在root用户下执行此脚本(0代表root用户的权限) if [ $(id -u) != "0" ];then echo "请在root用户下运行脚本" exit 1 fi #定义输出目录 DIR="/var/log/" TIME="$(date +%Y