zoukankan      html  css  js  c++  java
  • 10_bash_变量_条件判断及运算_sed_循环

    shell编程:

    编译器、解释器
    编程语言:机器语言、汇编语言、高级语言

    静态语言:编译型语言
      强类型(变量):变量在使用前,必须事先声明,甚至还需要初始化
      事先转换成可执行格式
      C/C++、C#、Java...
    动态语言:解释型语言
      弱类型:变量用时声明,拿来直接用,不需要提前声明,甚至不区分类型
      边解释边执行
      PHP,SHELL,Python...

    面向过程:SHELL,C
    面向对象:Java,Python,C++
    用其所长,避其所短

    变量:内存空间,命名

    内存:编址的存储单元

    变量类型:事先确定数据的存储格式和长度
      字符
      数值
        整型
        浮点型

    逻辑运算:与,或,非,异或
    与:只要一个为假,结果一定为假
    或:只要有一个为真,结果一定为真
    非:非真=假,非假=真

    shell:弱类型编程语言
      NULL:空

    变量赋值:VAR_NAME=VALUE

    引用变量:${VARNAME},括号有时可省略

    bash的变量类型:
      环境变量
      本地变量(局部变量)
      位置变量
      特殊变量

    本地变量:
    set VARNAME=VALUE:作用域为整个bash进程

    局部变量:
    local VARNAME=VALUE:作用域为当前代码段

    环境变量:作用域为当前shell进程及其子进程
    export VARNAME=VALUE
      "导出"


    脚本在执行时会启动一个子shell进程
      命令行中启动的脚本会继承当前shell环境变量

      系统自动执行的脚本(非命令行启动)就需要自我定义需要各环境变量

    位置变量:
    $1,$2,...
    shift
      shift #

    特殊变量:
    $?:保存上一个命令的执行状态返回值
    $#:参数的个数
    $*:参数列表
    $@:参数列表


    程序执行,可能有两类返回值
      程序执行结果
      程序状态返回代码(0-255)
        0:正确执行
        1-255:错误执行,1,2,127系统预留

    输出重定向:
    >
    >>
    2>
    2>>
    &>

    /dev/null:软件设备(软件模拟设备),bit bucket,数据黑洞

    撤销变量:
    unset VARNAME

    查看当前shell中变量:
    set

    查看当前shell中的环境变量:
    printenv
    env
    export

    位置和特殊不能查看


    脚本:命令的堆砌,按照实际需要结合命令流程控制机制实现的源程序

    shebang:魔数
    #!/bin/bash
    #注释行,不执行


    条件判断:
      如果用户不存在
        添加用户,给密码并显示添加成功
      否则
        显示如果已经存在,没有添加

    bash中如何实现条件判断?
    条件测试类型:
      整数测试
      字符测试
      文件测试

    条件测试的表达式:
      [ expression ]
      [[ expression ]]
      test expression

    整数比较:
      -eq:测试两个整数是否相等;比如 $A -eq $B #写作[ $A -eq $B ]
      -ne:测试两个整数是否不等
      -gt:测试一个数是否大于另一个数
      -lt:测试一个数是否小于另一个数
      -ge:大于或等于
      -le:小于或等于

    命令间的逻辑关系:
      逻辑与:&&
      逻辑或:||

    如果用户user6不存在,就添加用户user6
      ! id user6 && useradd user6
      id user6 || useradd user6

    如果用户存在,就显示用户已存在,否则,就添加此用户
    id user1 && echo "user1 exists." || useradd user1

    如果用户不存在,就添加;否则,显示其已经存在
    ! id user1 && useradd user1 || echo "user1 exists."

    如果用户不存在,就添加并且给密码,否则,显示其已经存在
    ! id user1 && useradd user1 && echo "user1" | passwd --stdin user1 || echo "user1 exists."


    练习:写脚本,完成以下任务
    1、添加5个用户,user1,...,user5
    2、每个用户的密码同用户名,而且要求,添加密码完成后不显示passwd命令的执行结果信息
    3、每个用户添加完成后,都要显示用户某某已经添加成功


    练习:写一个脚本,完成以下任务
    1、使用一个变量保存一个用户名
    2、删除此变量中的用户,且一并删除其家目录
    3、显示"用户删除完成"类的信息


    练习:写一个脚本,完成以下要求
    1、添加三个用户user1,user2,user3;但要先判断用户是否存在,不存在而后再添加
    2、添加完成后,显示一共添加了几个用户,当然,不能包括因为事先存在而没有添加的
    3、最后显示当前系统上共有多少个用户


    练习:写一个脚本,完成以下要求
    给定一个用户:
      1、如果其UID为0,就显示此为管理员
      2、否则,就显示其为普通用户



    条件判断,控制结构:
    单分支if语句
    if 判断条件; then
      statement1
      statement2
      ...
    fi


    双分支的if语句:
    if 判断条件; then
      statement1
      statement2
      ...
    else
      statement3
      statement4
      ...
    fi


    多分支的if语句
    if 判断条件1; then
      statement1
      ...
    elif 判断条件2; then
      statement2
      ...
    elif 判断条件3; then
      statement3
      ...
    else
      statement4
      ...
    fi

    练习:写一个脚本
    判断当前系统上是否有用户的默认shell为bash;
    如果有,就显示有多少个这类用户;否则,就显示没有这类用户
    #!/bin/bash
    #
    grep "<bash$" /etc/passwd &> /dev/null
    RETVAL=$?
    if [ $RETVAL -eq 0 ]; then
      USERS=`grep "<bash$" /etc/passwd | wc -l`
      echo "The shells of $USERS users is bash"
    else
      echo "No such user."
    fi

    ####"引用"一个命令的执行结果,要使用命令引用;比如:RESAULTS=`wc -l /etc/passwd | cut -d: -f1`;
      使用一个命令的执行状态结果,要直接执行此命令,一定不能引用;比如:if id user1一句中的id命令就一定不能加引号
      如果想把一个命令的执行结果赋值给某变量,要使用命令引用,比如USERID=`id -u user1`;
      如果想把一个命令的执行结果保存下来,并作为命令执行成功与否的判断条件,则需要先执行此命令,而后引用其状态结果,如
        id -u user1
        RETVAL=$?
        此句绝对不可以写为RETVAL=`id -u user1`;

    shell中如何进行算术运算:
    1、let 跟算术运算表达式
      let C=$A+$B
    2、$[算术运算表达式]
      C=$[$A+$B]
    3、$((算术运算表达式))
      C=$(($A+$B))
    4、expr 跟算术运算表达式,表达式中各操作数及运算符之间要有空格,而且要使用命令引用
      C=`expr $A + $B`


    定义脚本退出状态码
    exit:退出脚本
      exit #:自定义状态码
    如果脚本没有明确定义退出状态码,那么,最后执行的一条命令的退出吗即为脚本的退出状态码


    文件测试:
    -e FILE:测试文件是否存在
    -f FILE:测试文件是否为普通文件
    -d FILE:测试指定路径是否为目录
    -r FILE:测试当前用户对指定文件是否有读权限
    -w FILE:测试当前用户对指定文件是否有写权限
    -x FILE:测试当前用户对指定文件是否有执行权限

    [ -e /etc/inittab ]
    [ -x /etc/rc.d/rc.sysinin ]


    测试脚本是否有语法错误的(测试结果只是提供一个建议,仅供参考)
    bash -n

    bash -x:脚本单步执行

    #### sed ###

    三大基本文本处理工具:
    grep
    sed(流编辑器)
    awk(报告文本的生成器)

    sed基本能用法:
    sed:Stream EDitor
      sed是一个行编辑器,它只是操作纯ASCII码的文本的,其次它在操作文本的时候,逐行进行
      行编辑器(全屏编辑器:vi)

    模式空间
    默认情况下不编辑原文件,仅对模式空间中的数据做处理,而后,处理结束后,将模式空间打印至屏幕

    sed [options] 'AddressCommand' file ...
      -n:静默模式,不再默认显示模式空间的内容
      -i:直接修改原文件(小心用)
      -e SCRIPT -e SCRIPT:可以同时执行多个脚本
      -f /PATH/TO/SED_SCRIPT :把多个执行的脚本写在一个文件里面,这个文件每一行就是一个脚本,使用-f读取这个文件,也能执行脚本
        sed -f /path/to/scripts file
      -r:表示使用扩展正则表达式


    Address:
    1、StartLine,EndLine
      比如1,100
      $:最后一行
    2、/RegExp/ 使用正则表达式来使用的模式
      /^root/
    3、/pattern1/,/pattern2/
      第一次被pattern1匹配到的行开始,至第一次被pattern2匹配到的行结束,这中间的所有行
    4、LineNumber
      指定的行
    5、StartLine,+N
      从startline开始,向后的N行:一般指N+1行,当前行和后面的N行


    Command:
      d:删除符合条件的行
      p:显示符合条件的行(模式一次,打印一次。屏幕打印结果会显示两次,不想显示两次就在命令前使用-n选项)
      a string:在指定的行后面追加新行,内容为string
       :可以用于换行
      i string:在指定的行前面添加新行,内容为string
      r FILE:将指定的文件内容添加至符合条件的行处
      w FILE:将地址指定范围内的行另存至指定的文件中
      s/pattern/string/:查找并替换,默认只替换每行中第一次被模式匹配到的字符串
        加修饰符:s/pattern/string/修饰符
        g:全局替换
        i:查找时忽略字符大小写
      s///:s###,s@@@..这个分隔符只要三个是一样的都行,不是仅限于斜线


      l..e: like-->liker
        love-->lover

      sed 's/l..e/&r/g' file
      sed 's/(l..e)/1r/g' file
      如果只匹配前面一部分的时候,只能使用后向引用
      &:引用模式匹配整个串


    字符测试:
    ==:是否相等,相等为真,不等为假
    !=:是否不等,不等为真,相等为假
    <
    >
    -n string:测试指定字符串是否为空,空则为真,不空则假
    -z string:测试指定字符串是否不空,不空为真,空则为假


    循环:进入条件,退出条件
    for循环
    while循环
    until循环

    for 变量 in 列表;do
      循环体
    done


    如何生成列表:
    {1..100}
    `seq [起始数 [步进长度]] 结束数`

    declare:表示声明的意思
    -i:integer
    -x:声明为环境变量

    写一个脚本,计算1-100的和
    #!/bin/bash
    #
    declare -i SUM=0

    for I in {1..100};do
      let SUM=$[$SUM+$I]
    done
    echo "The sum is: $SUM."

  • 相关阅读:
    PYTHON 爬虫笔记八:利用Requests+正则表达式爬取猫眼电影top100(实战项目一)
    PYTHON 爬虫笔记七:Selenium库基础用法
    PYTHON 爬虫笔记六:PyQuery库基础用法
    java练习题(六)
    js练习题(三)
    js练习题(一)
    表格
    MAYA网络Z1J10928
    //绑定select下拉框change事件只执行一次
    枚举数组转换字符串
  • 原文地址:https://www.cnblogs.com/xian-luo/p/10204777.html
Copyright © 2011-2022 走看看