• shell编程


    转至:https://www.cnblogs.com/jhzsc666/p/13874237.html

    一、介绍

    什么是解释性语言?什么是编译型语言?
    程序不需要编译,程序在运行时由解释器翻译成机器语言。每执行一次都要翻译一次因此效率比较低。
    程序在执行前需要一个专门的编译过程,把程序编译成为假期语言文件,运行时不需要重新翻译,直接使用编译的结果。

    二、脚本的作用

    脚本的格式
    #!/bin/bash
    脚本的作用
    1.自动化软件部署 2.自动化分析处理 3.自动化备份 4.自动化监控脚本

    三、she怎末用

    脚本运行方式
    sh/bash 绝对路径|相对路径
    chmod+x 脚本名称  ./脚本名称
    在任意地方执行脚本 将脚本移动至bin目录  脚本名称

    四、shell变量

    定义用户变量
    变量名=值
    变量名=`执行命令`
    变量名=$(执行命)
    读取变量
    echo ${A:2:3} 2下标 3往后截取的长度
    echo ${A}
    echo $A
    作用域 只在当前会话的当前用户下有效
    全局环境变量
    export 变量名=值
    作用域  针对于当前会话的所有用户有效
    系统环境变量
    需要在 vim /etc/profile 定义变量 export 变量名=值
    变量生效 source /etc/profile
    特殊变量
    $n 语法:$n (功能描述:n为数字,$0代表该脚本名称,$1-$9代表第一到第九个参数,十以上的参数,十以上的参数需要用大括号包含,如${10})
    $# 获取所有参数的个数
    $* 获取所有参数 加“”会把参数看作一个整体
    $@ 获取所有参数  加“”也是 把每个参数分区对待
    $? 返回上一次执行命令的将结果 正确返回0 错误返回一
     
    $*和$@都表示传递给函数或脚本的所有参数,不被双引号“”包含时,都以$1 $2 …$n的形式输出所有参数;当它们被双引号“”包含时,“$*”会将所有的参数作为一个整体,以“$1 $2 …$n”的形式输出所有参数;“$@”会将各个参数分开,以“$1” “$2”…”$n”的形式输出所有参数。
    案例:
    for i in "$@"
    do
      echo $i
    done
    for i in "$*"
    do
      echo $i
    done

    五、shell数组

    Shell 数组用括号来表示,元素用"空格"符号分割开,如果元素中包含空格,则该元素使用双引号引起来,例如"hello word"

    语法:arr=(1 2 3 4 5 6 7 8)
    赋值:可以创建时添加如上
              通过下标添加 arr[n]=_?_
    读取:
    echo ${arr[*]}  echo ${arr[@]} 获取数组中所有元素
    echo ${arr[2]} 通过下表获取元素
    echo ${#arr[*]}  echo ${#arr[@]} 获取数组的长度
    unset arr[2] 通过下表删除数组的元素 并删除这这个下标

    六、shell运算符

    整数运算符 
    $((运算式)) $[运算是] “+,-,*,/,%” 运算符间可以不要空格
    echo $[(2*2)+4]
    expr +,-,*,/,%, 运算是之间要有空格
     expr `expr 2 * 2` * 4
    小数运算
    bc:Linux下的一个计算器程序,可以处理整数和小数。Shell 本身只支持整数运算,想计
    算小数就得使用 bc这个外部的计算器
    语法:echo "scale=小数位数" ; 运算式" | bc
    案例:
    计算3*8/7 结果保留4位小数: echo "scale=4; 3*8/7" | bc
    计算4/9,保留2位,结果赋值给ret变量   ret=$(echo "scale=2;4/9"|bc) echo $ret

    七、shell条件判断

    语法  []条件非空即true
    [ condition ] (注意:condition前后要有空格)
    (1)两个整数之间比较
       == 字符串比较
       -lt 小于(less than)   
       -le 小于等于(less equal)
       -eq 等于(equal)    
       -gt 大于(greater than)
       -ge 大于等于(greater equal) 
       -ne 不等于(Not equal)
    (2)按照文件权限进行判断
       -r 有读的权限(read)   
       -w 有写的权限(write)
       -x 有执行的权限(execute)
    (3)按照文件类型进行判断
      -f 文件存在并且是一个常规的文件(file)
      -e 文件存在(existence)  
      -d 文件存在并是一个目录(directory)
    案例:
    判断文件是否具有写权限
    [jinghang@hadoop101 datas]$ [ -w helloworld.sh ]
    [jinghang@hadoop101 datas]$ echo $?  代表上一条命令执行结果 正确返回0 错误返回1
    0
    判断目录中的文件是否存在
    [jinghang@hadoop101 datas]$ [ -e /home/jinghang/cls.txt ]
    [jinghang@hadoop101 datas]$ echo $?
    1
    多条件判断(&& 表示前一条命令执行成功时,才执行后一条命令,
    || 表示上一条命令执行失败后,才执行下一条命令)
    [jinghang@hadoop101 ~]$ [ condition ] && echo OK || echo NOTOK
    OK
    [jinghang@hadoop101 ~]$ [ condition ] && [ ] || echo NOTOK
    NOTOK

    八、shell流程控制

    (一)if 判断语句

    语法1: if [ 条件判断式 ]
         then
         主体代码
         fi
    语法2: if [ 条件判断式 ]
         then
         主体代码
         else                       
         主体代码
         fi
    语法3: if [ 条件判断式 ]
         then
         主体代码
         elif [条件判断式]
         then
         主体代码
         else
         主体代码
         fi
    注意事项:(1)[ 条件判断式 ],中括号和条件判断式之间必须要有空格
                    (2)if后要有空格
    案例:
    编写一个脚本,传入文件或者目录名称
    (1)判断文件或者目录是否存在,存在则完成(2)(3)步骤,不存在则输出文件或目录不存在
    (2)如果是文件输出路径并打印"该路径为文件路径",并往文件中写入 "你真好看"
    (3)如果是目录,输出路径并打印"该路径为目录路径",并在该路径下创建bbb.txt文件

    (二)case 判断语句

    语法
    case $变量名 in
      "值1")
        如果变量的值等于值1,则执行程序1
        ;;
      "值2")
        如果变量的值等于值2,则执行程序2
        ;;
      …省略其他分支…
      *)
        如果变量的值都不是以上的值,则执行此程序
        ;;
    esac
    注意事项:
    (1)case行尾必须为单词“in”,每一个模式匹配必须以右括号“)”结束。
    (2)双分号“;;”表示命令序列结束,相当于java中的break。
    (3)最后的“*)”表示默认模式,相当于java中的default。

    (三)for 循环语句

    语法1:
    for (( i=0;i<100;i++ ))
    do
     程序
    done
    语法2:
        $*:读取传入脚本中的全部参数,把参数看作一个整体
        $@:读取传入脚本中的全部参数,把参数区分对待
     for  变量  in "$*"
     do
       程序
     done
     for  变量  in "$@"
     do
       程序
     done
    案例:
    从1加到100
    #!/bin/bash
    sum=0
    for((i=0;i<=100;i++))
    do
            sum=$[ sum+i ]
    done
    echo $sum
    [jinghang@hadoop101 datas]$ chmod 777 for1.sh
    [jinghang@hadoop101 datas]$ ./for1.sh
    “5050”

    (四)while 循环语句

    语法
    while [ 条件判断式 ] 注意 :while 和条件判断式 与[之间都要有空格
      do
        程序
      done
    5.until 循环语句
    until 循环执行一系列命令直至条件为 true 时停止
    until [ 条件判断式 ]
    do
        主题代码
    done
    案例:
    #!/bin/bash
    i=0
    sum=0
    until [ $i -eq 101 ]
    do
        sum=$[sum+i]
        i=$[i+1]
    done
    echo $sum
    echo $i

    九、read读取控制台输入

    语法
    read [选项] [参数]
    选项  功能
    -p    指定读取值时的提示符
    -t    指定读取值时等待的时间(秒)
    参数:指定读取的值的变量名
    案例:
    1.使用read命令读取命令行输入参数,提示“Enter your name in 7 seconds”,
    把用户输入参数赋值给NAME变量

    十、shell函数

    (一)系统函数

    basename
     basename命令会删掉所有的前缀包括最后一个(‘/’)字符,然后将字符串显示出来
     basename [string / pathname] [suffix]
      可选项:suffix为后缀,如果suffix被指定了,basename会将pathname或string中的suffix去掉。
     案例:

    dirname
     从给定的包含绝对路径的文件名中去除文件名(非目录的部分),然后返回剩下的路径(目录的部分)
     dirname 文件绝对路径 
     案例

    (二)自定义函数

     语法:
      [ function ] funname()
            {
             Action;
             [return int;]
            }
            funname
     经验技巧
     (1)必须在调用函数地方之前,先声明函数,shell脚本逐行运行。不会先编译。
     (2)函数返回值,只能通过$?系统变量获得,可以显示加:return返回,如果不加,将以最后一条命令运行结果,作为返回值。return后跟数值n(0-255)
     案例
      输入两个参数,计算两个参数的和
    补充:
    用户函数定义在当前用户主目录下的.bashrc文件里在当前用户下所有的会话都有效
    调用前要source一下
    系统函数定义在/etc/profile文件下 对所有用户所有会话都有效
    也要source一下

    十一、shell文本处理

    (一)cut

    功能描述:cut的工作就是“剪”,具体的说就是在文件中负责剪切数据用的,cut指令用
    户显示行中的指定部分,删除文件中的指定字段。
    cut [选项] [文件]
    选项   功能
    -b    -b <起始字节位置-结束字节位置>仅显示行中指定字节范围的内容。例如,“-b
           2-10”将显示第2~10个字节位置的内容,当只有一个数字时,则仅显示指定字符
        位置的内容.
    -f     <起始列位置-结束列位置>   显示指定的字段内容
    -d     <分隔符>  指定字段的分隔符,默认的字段分隔符为“TAB”
    -c     <起始字符位置-结束字符位置>   仅显示行中指定范围的字符。例如,
            “-c2-10” 将显示第2~10个字符位置的内容。当只有一个数字时,则仅显示指定
      字符位置的内容
    案例:
    (1)切割cut.txt第一列
     cut -d " " -f 1 cut.txt
    (2)切割cut.txt第二、三列
     cut -d " " -f 2,3 cut.txt
    (3)切割ifconfig 后打印的IP地址

    (二)sort

    功能描述:它将文件进行排序,并将排序结果标准输出
    语法:sort 【选项】【参数】
                选项    功能
              -n     依照数值的大小排序
             -r     以相反的顺序来排序
             -t     设置排序时所用的分隔字符
             -k     指定需要排序的列
             参数:是指待排序的文件
    案例:如有以下数据

    按照整数排序:

    按照小数排序

    (三)正则表达式

     正则表达式,又称规则表达式。(英语:Regular Expression,在代码中常简写为
     regex、regexp或RE)。正则表达式通常被用来检索、替换那些符合某个模式(规则)
     的文本单字符匹配
      d    匹配一个数字字符。等价于[0-9]
      D   匹配一个非数字字符。等价于[^0-9]
      w   匹配包括下划线的任何单词字符。类似但不等价于[A-Za-z0-9_]
      W  匹配任何非单词字符。等价于 [^A-Za-z0-9_]
      s   匹配空白字符,包括空格、制表符、换页符等等,等价于[ f v]
      S   匹配任何可见字符。等价于[^ f v]
      .点  匹配除“ ”和" "之外的任何单个字符
      [a-z]  字符范围,匹配a~z之间的任意字符
      [^a-z] 匹配除了a~z之间的其他字符
         匹配换行符
     多字符匹配
      +   匹配前面的子表达式一次或多次(大于等于1次)
      *   匹配前面的子表达式任意次
      ?  匹配前面的子表达式零次或一次
      {n}  n是一个非负整数。匹配确定的n次
      {n,m}  m和n均为非负整数,其中n<=m。最少匹配n次且最多匹配m次
     其他
      ^  匹配输入字行首
      $  匹配输入行尾
      | 将两个匹配条件进行逻辑“或”(or)运算
      x|y  匹配x或y

    (四)sed

     功能描述:sed是一种单行文本流式编辑器,它一次处理一行内容。处理时,把当前处理的行存储在临时缓冲区中,称为“模式空间”,接着用sed命令处理缓冲区中的内容,处理完成后,把缓冲区的内容送往屏幕。接着处理下一行,这样不断重复,直到文件结束。文件内容并没有改变,除非你使用重定向存储输出。
     语法:sed [选项]  ’命令‘   文件名
      选项    功能
      -e    直接在指令列模式上进行sed的动作编辑(一次执行多个操作时)。
      -i     直接编辑文件
      -n                   取消默认输出sed默认会输出所有文本内容,使用-n
                              参数后只显示处理过的行 
      
      命令    功能
      p     打印一般 -n 配合使用
      a      新增,在指定的行之后插入内容
      i       新增,在指定的行之前插入内容
      d     删除
      s     查找并替换 (注意:如果进行全局的查找替换 sed -i ‘s/查找条件/替换字符串/g’   global)
     案例:
      数据准备

      (1)将“mei nv”这个单词插入到sed.txt第二行下,打印。

      (2)删除sed.txt文件所有包含wo的行
      

      (3)将sed.txt文件中wo替换为ni

        注意:‘g’表示global,全部替换
      (4)将sed.txt将wo替换为ni只打印处理后的行
     
      (5)批量添加注释

      (6)批量取消注释
      

    (五)awk

     功能描述:是一门编程语言,也是一个强大的文本分析工具,逐行扫描文件,
     默认从第一行到最后一行,寻找匹配特定模式的行,并在这些行上进行你想要
     的操作。
     
     语法:awk 选项  ‘pattern1{action1}  pattern2{action2}...’   文件名
      pattern:表示AWK在数据中查找的内容,就是匹配模式
            action:在找到匹配内容时所执行的一系列命令
      选项   功能
      -F    指定输入文件的分隔符
      -v    赋值一个用户定义变量
     案例1:
      passwd文件
      (1)搜索passwd文件以root关键字开头的所有行,并输出该行的第1列和第7列。
      
        注意:只有匹配了pattern的行才会执行action
          (2)搜索passwd文件以root和lisi关键字开头的所有行,并输出该行的第1列和第7列。
       
      (3)只显示/etc/passwd的第一列和第七列,,且在所有行前面添加列名user,shell在最后一行添加"总用户数:用户数量"。
      
        注意:BEGIN 在所有数据读取行之前执行;END 在所有数据执行之后执行。
      (4)将passwd文件中的用户id增加数值1并输出计算后的用户id和用户名

      (5)切割IP
       
              (6)统计passwd文件用户id大于500的用户数,和统计id小于500的用户数

     awk的内置变量

      变量    说明
      FILENAME  文件名
      NR     已读的记录数
      NF     浏览记录的域的个数(切割后,列的个数)
     案例2:
      (1)统计passwd文件名,每行的行号,每行的列数
       
      (2)查询sed.txt中空行所在的行号并统计行号总数

      
  • 相关阅读:
    星球基地
    手机评价
    2018
    mongoDB(Window)
    linux
    【整理】Java 11新特性总结
    【整理】Java 10新特性总结
    【整理】Java 9新特性总结
    【整理】Java 8新特性总结
    Java -- 内部类(二)
  • 原文地址:https://www.cnblogs.com/my-first-blog-lgz/p/13876700.html
Copyright © 2020-2023  润新知