bash脚本编程实践总结(图文)

从操作系统层面来说,shell是一个“壳”,人机交互接口,实质上shell就是命令解释器,解析用户输入的命令,进而达到人机交互的功能

bash编程语言属于弱类型编程语言,不区分数据类型,所有数据默认当做字符处理,若要做运算处理,则需要使用算术表达式,同时也是过程式编程语言,以指令为中心,围绕指令设计数据

过程式编程语言:
        顺序执行
        选择执行
        循环执行

shell编程本质:语法结构+命令堆积

脚本编写:
    首行定顶格给出shebang(这是个固定格式)
        #!/bin/bash
        #!/bin/bash
        #!/bin/tcsh
        #!/usr/bin/python3
        #!/usr/bin/perl
        给出任意一个就行,基于所使用的shell类型

#号表示注释信息,不会当做命令行处理

操作系统:CentOS Linux release 7.2.1511 (Core)

内核版本:3.10.0-327.10.1.el7.x86_64



运算表达式:



let name=$[算术表达式]
    let name=$((算术表达式))

图例:

    



逻辑运算:



与运算:command1 && command2
        真 && 真 = 真
        真 && 假 = 假
        假 && 真 = 假
        假 && 假 = 假

总结:真真才为真,有假必假

图例:与运算,若前面命令执行成功则为真,后面命令执行,若前面命令执行失败则为假,则后面命令不执行

或运算:command1 || command2
        真 || 真 = 真
        真 || 假 = 真
        假 || 真 = 真
        假 || 假 = 假

总结:有真必真,假假才假

图例:或运算,若前面命令执行成功则为真,后面命令不执行,若前面命令执行失败则为假,后面命令执行

非运算:!command(叹号取反)
        !真 = 假
        !假 = 真

三种运算的优先级区分:与>或>非

图例:取反只是取反命令的执行状态,echo $? 的返回值,命令执行本身实则执行成功

命令执行状态:
        0:执行成功
        1-255:执行失败(非零)

注意,当命令作为条件判断时,引用的是命令的执行状态,即命令执行成功与否
    
位置参数变量:手动传递参数给脚本
    在bash脚本中,给出一个或多个变量参数:
    $1:第一个参数
    $2:第二个参数
    $3:第三个参数
    ...
    在执行脚本时手动添加参数,多个参数之间以空格隔开
        例如:#!/bin/bash
            echo $1
            echo $2

图例:

特殊变量:
    $0   脚本文件路径自身
    $#   表示脚本参数的个数
    $*,[email protected]:引用所有的位置参数



测试表达式:



test 测试表达式
    [ 测试表达式 ]
    [[ 测试表达式 ]]

注意,括号和表达式之间有空格隔开

数值测试:
        -eq:是否等于
        -ne:是否不等于
        -gt:是否大于
        -ge:是否大于等于
        -lt:是否小于
        -le:是否小于等于

图例:设定两个变量num1和num2,测试num1是否大于num2,大于则为真,反之则为假

字符测试:[[ ]]
        -z:字符是否为空,空则真
        -n:判断字符是否不为空
        ==:是否等于
        =~:是否包含
        >:是否大于
        <:是否小于
        !=:是否不等于

示例:查看主机名是否包含linux字符串



文件测试:



单目测试:
        
        文件是否存在:
            -e file 文件存在,则为真

-a file 同-e

文件类型测试:
            -f file 是否为普通文件
            -b file 是否为块设备
            -c file 是否为字符设备
            -d file 是否为目录
            -h/-L file 是否为连接符号
            -p file 是否为管道设备
            -s file 是否为套接字设备
        
        文件权限测试:
            -r file 当前文件是否存在并当前用户是否有读权限
            -w file 当前文件是否存在并当前用户是否有写权限
            -x file 当前文件是否存在并当前用户是否有执行权限

从属关系测试:
            -O file 当前用户是否为文件属主
            -G file 当前用户是否为文件属组
        
        时间戳测试:
            -N file 文件自从上次操作后是否被改过

双目测试:
    file -ef file2 是否指向同一个文件系统的相同inode的硬链接
    file -nt file2 file文件是否新于file2
    file -ot file2 file文件是否旧于file2



条件判断:



单分支:
        if 条件;then
        执行分支1
    双分支:
        if 条件;then
        执行分支1
        else
        执行分支2
    多分支:
        if 条件;then
        执行分支1
        elif 条件2;then
        执行分支2
        ...
        else
        执行分支n



交互式脚本:



read  [-p|-t]  "words"  VARNAME . . .

图例:



for循环:



语法:
        for VAR_ANME in value1 value2 value3 ...; do
        COMMAND... 变量引用
        done

( 红色标记为固定语法结构)

例:添加10个用户suer1-user10
            for num in {1..10}; do
            useradd user$num
            done

列表方法:
              {1..10}=1 2 3 4 5 6 7 8 9 10
            seq 起始数 步长 结束数
                seq 1 2 9=1 3 5 7 9

for循环,把变量名所对应的变量列表进行遍历

练习:
    1.写一个脚本,分别计算
   (1) /etc/passwd 文件中 第15个用户和第18个用户的ID号之和
    (2)/etc/rc.d/init.d/functions 和  /etc/rc.d/init.d/network 文件的空白行数之和

2.写一个脚本,完成如下功能,判断给定的两个数值,谁大谁小, 使用位置参数和命令交互

3写一个脚本,提示用户输入一个字符串,如果输入的是quit,则退出,否则,显示其输入的字符串内容。

4.用户for循环将/etc/passwd的第3,7,11个用户的用户名和id显示出来

5.写一个脚本,用户for循环实现
    显示、/etc/init.d/functions、 /etc/rc.d/rc.local和/etc/fstab各有多少行

6.将上题中三个文件复制到/tmp目录下,分别将每个文件的最近一次修改时间改为2011年9月15号13点27分,用for循环实现

7.通过命令参数,给定两个数字,输出其中最大的数字,若数字相同,则提示相同,若参数超过两个,则报错退出。

8.写一个脚本,该脚本可以一次性添加3名用户,通过传参数的方式,进行用户名添加,当传递的参数不符合3个的时候,报错并退出,当传递完成后,输出哪些用户被进行了添加。当三名用户添加完成后,将本脚本权限改成属主可读可写可执行

9. 判断,/etc/passwd 是否为文件,如果为文件,则输出 /etc/passwd is files ,该路径通过命令传递的方式传入,当传入的参数个数大于1 ,则报错

10.通过命令行参数,给定两个文本文件名,如果某文件不存在,则结束脚本执行,若都存在时,返回每个文件的行数,并echo出其中行数较多的文件名

11.背景:公司来了个新员工,需要给新员工开通帐号和统计出新员工的信息(通过交互的方式)

让用户指定一个用户名和密码,若用户名之前存在,先进行删除。之后则为用户添加系统帐号。

完成后,需要统计员工的:手机号,email,QQ号,年龄信息,收集后存储到该用户的家目录中。

完成以上操作,询问该用户,是否需要给用户单独建立一个工作目录为/data/username,默认是需要,如果不需要,则需输入n或者N

时间: 2024-10-14 03:24:20

bash脚本编程实践总结(图文)的相关文章

bash脚本编程知识储备

bash脚本编程: ????脚本程序:解释器解释执行: 首先得理清一些琐碎的知识点,我尽量把我所学的帮朋友一起梳理一下 编程环境:(我会在接下来的篇章,图文例子三结合的方式带大家一起学习) ???????????? 流程控制语句: ???????????????? 顺序执行: ???????????? 循环执行: ???????????????? 选择执行: 2. ????????bash变量是弱类型:默认字符型: ? ????????变量引用:${VAR_NAME} ????????引号: ?

高级Bash脚本编程指南

http://tldp.org/LDP/abs/html/ 高级Bash脚本编程指南对脚本语言艺术的深入探索 本教程不承担以前的脚本或编程知识,但进展迅速走向一个中级/高级水平的指令...一直偷偷在细小的UNIX®智慧和学识.它作为一本教科书,一本手册,自学,并作为一个参考和知识的来源,壳牌的脚本技术.练习和大量的评论实例请读者参与,在这样的前提下,真正学习脚本的唯一途径是编写脚本.这本书是适合课堂使用的一般介绍编程的概念.本文件被授予公共领域.没有版权! 奉献对于安妮塔,所有魔术的来源内容表第

bash脚本编程之条件判断、条件测试

脚本编程: 编程面向过程有如下几种执行方式 顺序执行 选择执行:  如 if, case 循环执行:  如 for, while, until bash的变量类型: 本地变量 set VAR_NAME=value 设置变量赋值 如: set User=Centos unset VAR_NAME 撤消变量赋值 如: unset User=Centos ${VAR_NAME} 作用范围:当前shell进程: 局部变量 local VAR_NAME=value 设置变量赋值 unset VAR_NAM

bash脚本编程之变量、变量类型、条件测试、算术运算、及特殊变量

一.学习目的 1.了解bash脚本的变量类型及变量的使用 2.了解bash中条件测试的种类及如何在bash中实现条件的判断 3.学会在bash中做算术运算 4.了解特殊变量的使用 二.学习内容 1). ①.bash的变量类型: 环境变量 .本地变量.局部变量.位置变量.特殊变量 环境变量: export VALUENAME = VALUE 作用领域是当前的shell进程及其子进程 本地变量: VALUENAME= VALUE 作用领域为整个bash的进程 局部变量:local VALUENAME

《高级Bash脚本编程指南》十年来首次修订

新年伊始,开源慕课的知识库上线了.初期提供了<Linux命令大全/Bash 参考><高级Bash脚本编程指南>两个系列.其他资料正将陆续上线. 其中,<高级Bash脚本编程指南>对于Shell学习者来说,是一本神一样的书籍. 它的原作者是Mendel Cooper,英文名叫<Advanced Bash-Scripting Guide>发表在http://tldp.org/ 上,是一本免费的书籍. 有人说,学习Unix/Linux,有座山叫shell编程,你总

bash脚本编程之用户交互

bash脚本编程之用户交互: read [option]... [name ...] -p 'PROMPT'    读取输入的内容 -t TIMEOUT    超时时间,如果超过了该时间,继续执行下面代码 bash -n /path/to/some_script 检测脚本中的语法错误 bash -x /path/to/some_script 调试执行 示例: 输入一个磁盘文件信息,使用fdisk -l显示该磁盘信息 #!/bin/bash read -p "Enter a disk specia

bash脚本编程for

bash脚本编程:        if语句.bash -n.bash -x CONDITION:            bash命令:                用命令的执行状态结果:                    成功:true                    失败:flase 成功或失败的意义:取决于用到的命令: 单分支:            if CONDITION; then                if-true            fi 双分支:     

bash脚本编程基础

bash编程   bash脚本编程是过程式解释编程,其实就是linux命令的堆砌,既然是编程就应该有相应编程语法.    与任何过程式编程一样,过程式编程的特点就是:顺序执行,选择执行,循环执行.    过程式编程:以指令为中心,设计算法,数据服务于算法,过程式编程的灵魂:算法.    1.变量:数值变量,字符变量           bash环境:                本地变量:当前shell进程:                环境变量:当前shell进程及其子进程:       

压缩工具及bash脚本编程

回顾: RAID: 不同的服务器配置起来他的借口可能配置起来有所不同,但是官方一般都提供响应的说明书,按照说明书进行配置就行.关键是理解RAID级别的机制的意义是什么 LVM: 其实是一个逻辑设备他存在的主要作用是提供卷管理操作,我们称之为"volume", 卷管理操作的目的主要是实现把一个或多个底层的物理设备给组织成一个逻辑设备,我们可以将底层的任何类型的块设备,包括我们常见的基本磁盘分区,或者甚至是RAID都OK,只要他们提供块级别的存储空间,但是考虑到任何单个硬件设备他们的边界都