设为首页 收藏本站
查看: 968|回复: 0

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

[复制链接]
累计签到:1 天
连续签到:1 天
发表于 2016-3-16 12:34:12 | 显示全部楼层 |阅读模式
从操作系统层面来说,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=$((算术表达式))


    图例:
wKiom1bn-j2QdmtvAAAkm6xdPAc562.png


逻辑运算:



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

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

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

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

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

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

wKioL1bn-2Dz_YgSAAApEsn2ULU093.png

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

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

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


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

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

wKioL1bn_ByRGL9BAAAVhhhhi98428.png
wKiom1bn-8GjAGIsAAAWqN9z-SM785.png

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


测试表达式:

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

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

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

    图例:设定两个变量num1和num2,测试num1是否大于num2,大于则为真,反之则为假
wKiom1bn_NOSNmRVAAAdYW6OHsQ336.png
   
    字符测试:[[ ]]
        -z:字符是否为空,空则真
        -n:判断字符是否不为空
        ==:是否等于
        =~:是否包含
        >:是否大于
        <:是否小于
        !=:是否不等于

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



文件测试:


单目测试:
        
        文件是否存在:
            -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 . . .

图例:
wKiom1bn_2aRBQYEAAAXoasozik153.png


for循环:

    语法:
        for VAR_ANME in value1 value2 value3 ...; do
        COMMAND... 变量引用
        done
        
       ( 红色标记为固定语法结构)
        

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

        列表方法:
              {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 文件的空白行数之和  
wKiom1boBtSSxIuCAABH0t2rAB8506.png

wKioL1boB4TAEhLsAAAjAkvkWrk428.png


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

wKioL1boCDnS_IbdAAAXoasozik893.png
wKiom1boB9uDBk2rAAARgNX-CcE281.png


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

wKioL1boCOfS8CrKAAAYD4EloFo998.png
wKiom1boCHzyZgdBAAAhJKq38qk090.png


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


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


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

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

wKiom1boCwzRoEtUAAAmc8aTmew031.png
wKiom1boCxODd72cAAAqMdoVUUY070.png

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

wKioL1boDA6R4tefAAAmckUJotc222.png
wKiom1boC-vwPnOEAAA3CzJ8isA552.png

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

wKiom1boDsHR6_9aAAAQ1xXZhVU745.png
wKioL1boD33B00GoAAAa8v18ni8239.png


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


    11.背景:公司来了个新员工,需要给新员工开通帐号和统计出新员工的信息(通过交互的方式)
让用户指定一个用户名和密码,若用户名之前存在,先进行删除。之后则为用户添加系统帐号。
完成后,需要统计员工的:手机号,email,QQ号,年龄信息,收集后存储到该用户的家目录中。

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


运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-191378-1-1.html 上篇帖子: PowerShell复制目录以及目录下文件 下篇帖子: 用shell脚本创建用户
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表