• Linux shell脚本


    Linux系统的结构

    何为linux的shell?

    各类程序或解释过后命令是通过Kernel(Linux内核)与Hardware(计算机硬件)交流,驱动硬件设备完成相关的行为;那么我们又通过什么与系统内核交流呢?没错的,是Shell,Shell 英文名叫“壳”,是一个处理用户请求的工具或接口,它负责解释用户输入的命令,调用用户希望使用的程序。

    一个完整的Shell脚本应该包括哪些内容?

    • 脚本声明
    • 注释信息
    • 可执行语句(即命令)

    e.g.

    luojialin@luojialin-PC:~/Desktop$ vim schtasks_screensaver.sh
    #! /bin/bash
     
    #create schtasks in order to update SpiderScreensaver on rand time
     
    echo "#SpiderScreensaver"  >> /etc/crontab
    echo "XX */2 * * * root /usr/local/bin/XXXX/XXXX" >> /etc/crontab

    上述脚本中实际上出现了三种不同的元素:

    • 第一行的脚本声明(#!)用来告诉系统使用哪种Shell解释器来执行该脚本;
    • 第二行的注释信息(#)是对脚本功能和某些命令的介绍信息,使得自己或他人在日后看到此脚本内容时,可以快速知道此脚本的作用或一些警告信息;
    • 第三、第四行的可执行语句也就是我们平时执行的Linux命令。

    注:脚本中的"X"代表某些特殊数值。

    linux中的sh、dash、bash的区别

    参见链接:

    https://blog.csdn.net/u011436427/article/details/105139536

    https://www.cnblogs.com/macrored/p/11548347.html

    注:Ubuntu、Deepin默认将sh重定向到dash

    一、Shell之if条件

    基本语法:
    if [ command ]; then
         符合该条件执行的语句
    fi
    扩展语法:
    
    if [ command ];then
         符合该条件执行的语句
    elif [ command ];then
         符合该条件执行的语句
    else

    说明:

    • bash shell会按顺序执行if语句,如果command执行后且它的返回状态是0,则会执行符合该条件执行的语句,否则后面的命令不执行,跳到下一条命令。
    • 当有多个嵌套时,只有第一个返回0退出状态的命令会导致符合该条件执行的语句部分被执行,如果所有的语句的执行状态都不为0,则执行else中语句。
    • 返回状态:最后一个命令的退出状态,或者当没有条件是真的话为0。

    注意:

    1. [ ]表示条件测试。注意这里的空格很重要。要注意在'['后面和']'前面都必须要有空格
    2. 在shell中,then和fi是分开的语句。如果要在同一行里面输入,则需要用分号将他们隔开。
    3. 注意if判断中对于变量的处理,需要加引号,以免一些不必要的错误。没有加双引号会在一些含空格等的字符串变量判断的时候产生错误。比如[ -n "$var" ]如果var为空会出错
    4. 判断是不支持浮点值的
    5. 如果只单独使用>或者<号,系统会认为是输出或者输入重定向,虽然结果显示正确,但是其实是错误的,因此要对这些符号进行转意
    6. 在默认中,运行if语句中的命令所产生的错误信息仍然出现在脚本的输出结果中
    7. 使用-z或者-n来检查长度的时候,没有定义的变量也为0
    8. 空变量和没有初始化的变量可能会对shell脚本测试产生灾难性的影响,因此在不确定变量的内容的时候,在测试号前使用-n或者-z测试一下
    9. ? 变量包含了之前执行命令的退出状态(最近完成的前台进程)(可以用于检测退出状态)

    e.g.

    #! /bin/bash
     
    #compare old content
    content=$(cat /etc/crontab | grep -w SpiderScreensaver)
     
    echo $content
     
    if [ "${content}" == "#SpiderScreensaver" ];then
        exit 1
    fi

    备注:

    • 执行命令行语句,需要获取其返回值时,必须使用XXX=$(XXX);
    • if语句中字符串比较,需要自带"";
    • if语句中的[]、==的前后都需要空格;

    参考链接:

    https://www.cnblogs.com/kaishirenshi/p/9732135.html

    https://www.cnblogs.com/kaishirenshi/p/9729800.html

    https://www.jb51.net/article/41571.htm

    二、Shell之for循环

    流程图:

     

    for 循环有三种结构:一种结构是列表for循环;第二种结构是不带列表for循环;第三种结构是类C风格的for循环

    1)第一类列表for循环

    for语法一:
    
    for i in a b c....
    
    do
    
        commands(代码块)
    
    done
    
    i为变量,in为赋值:把a b c...赋值给i
    for语法二:
    
    for i in {1..5}
    
    do
    
       commands(代码块) 
    
    done
    
    列表{1..5},循环5次,并把列表值赋值给i
    
    支持设置步长,比如for i in {1..100..2},步长为2
    for语法三:
    
    for file in $( ls )
    
    #for file in *
    
    do
    
       commands(代码块) 
    
       #echo "file: $file"
    
    done

    2)第二类不带列表for循环

         由用户制定参数和参数的个数,与上述的for循环列表参数功能相同。

    #!/bin/bash
    
    echo "number of arguments is $#"
    
    echo "What you input is: "
    
    #for argument in "$@"
    
    for argument
    
    do
    
         echo "$argument"
    
    done

        $#表示参数的个数,$@表示参数列表而$*则把所有的参数当作一个字符串显示。

         省略式比"#for argument in "$@""代码少了 $@参数列表,$*参数字符串。

    3)第三类C风格的for循环

    for((integer = 1; integer <= 5; integer++))
    
    do
    
        echo "$integer"
    
    done

        for中第一个表达式(integer = 1)是循环变量赋初值的语句,第二个表达式(integer <= 5)决定是否进行循环的表达式,退出状态为非0时将退出for循环执行done后的命令(与C中的for循环条件是刚好相反的)。第三个表达式(integer++)用于改变循环变量的语句。

    参考链接:

    https://blog.csdn.net/magi1201/article/details/75195983

    https://blog.csdn.net/taiyang1987912/article/details/38929069

    三、Shell之while循环

    流程图:

    语法
    
    while 条件测试
    do
      执行命令
    done

     e.g.

    #!/bin/bash
    while read test
    do
      echo ${test}
    done < /home/desktop/testfile

    说明:

    •  使用read有标准输入读取数据,放入变量kuangl中,如果读到的数据非空,就进入循环。
    •  把改行数据显示出来
    • 将/home/kuangl/scripts/testfile的内容转向输入将给read读取。

    四、Shell之case条件

    流程图:

  • 相关阅读:
    Python基础-time and datetime
    Python基础-包
    Python基础-常用模块
    第四十七天Python学习记录
    第四十四天Python学习记录
    如何教你在NIPS会议上批量下载历年的pdf文档(另附04~14年NIPS论文下载链接)
    如何用pdfbox-app-1.8.10.jar批处理将pdf文档转换成text文档
    如何在Win10下设置图片的浏览方式为windows照片查看器
    如何不通过系统升级来安装window10正式版?(特别针对Xp用户)
    Mysql统计信息处理及binlog解释
  • 原文地址:https://www.cnblogs.com/gd-luojialin/p/15028076.html
Copyright © 2020-2023  润新知