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."

  • 相关阅读:
    LeetCode 79. 单词搜索
    LeetCode 1143. 最长公共子序列
    LeetCode 55. 跳跃游戏
    LeetCode 48. 旋转图像
    LeetCode 93. 复原 IP 地址
    LeetCode 456. 132模式
    LeetCode 341. 扁平化嵌套列表迭代器
    LeetCode 73. 矩阵置零
    LeetCode 47. 全排列 II
    LeetCode 46. 全排列
  • 原文地址:https://www.cnblogs.com/xian-luo/p/10204777.html
Copyright © 2011-2022 走看看