• 第五单元 shell编程 摩天居士


    5.1 认识与学习Bash

    5.1.1 什么是变量

    变量:占用内存空间的一段地址

    5.1.2 设置变量规则

    1、变量名称只能是英文字母与数字,但是开头字符不能是数字

    2、变量用等号连接值,等号左右两边不能有空格

    3、变量的值如果有空格,需要使用单引号或双引号包括

    4、如果是把命令的结果作为变量值赋予变量,则需要使用反引号或$()包含命令

    5.1.3 单双引号区别与使用场景

    单引号:属于强引用,它会忽略所有被引起来的字符的特殊处理,被引用起来的字符会被原封不动的使用;

    双引号:属于弱引用,它会对一些被引起来的字符进行特殊处理。

    简单来说,单引号直接输出内部字符串,不解析特殊字符;双引号内则会解析特殊字符。

    示例:

     [root@bogon ~]# var=1
     [root@bogon ~]# echo '$var'
     $var
     [root@bogon ~]# echo "$var"
     1

    5.1.4 变量类型

    自定义变量:

    自定义变量可以理解为局部变量或者普通变量

    作用域:仅在当前shell中有效

    环境变量:

    环境变量也可以称为全局变量,使用export命令声明即可

    作用域:当前shell和子shell中有效

    位置变量:

    位置变量用于在命令行、函数、或脚本中传递参数,变量名不用自己定义,作用也是固定的,$0代表命令本身,​$1-$9代表接收的第一个到第九个参数

    预定义变量:

    预定义变量在shell中直接使用,位置变量也是预定义变量的一种。 预定义变量说明: $0 脚本名 $* 所有参数,强调整体 $@ 所有参数,强调独立 $# 参数的个数 $$ 当前进程的PID ​ $! 上一个后台进程的PID $? 上一个命令的返回值,0表示成功

    5.1.5 命令别名与历史命令

    命令别名alias, unalias

     alias 别名='指令名称'
     unalis 别名

    历史命令

     显示最近3条命令历史
      histroy 3
     重复执行第N条命令
      !N
     重复执行倒数第N条命令
      !-N
     重复执行上一条命令
      !!
     重复执行最近一条以string开头的命令
      !string

    5.2 awk&sed命令

    awk 也是一个非常棒的数据处理工具!相较于 sed 常常作用于一整个行的处理, awk 则比较倾向于一行当中分成数个“字段”来处理。因此,awk 相当的适合处理小型的数据处理

    5.2.1 awk基本用法

     语法:awk [选项参数] 'pattern1{action1}  pattern2{action2}...' filename
     选项:
        -F:指定输入文件折分隔符。
        -v:赋值一个用户定义变量。
        -f:引入awk执行脚本。
     示例:
      1、获取/etc/passwd文件的第三行和最后一行
      # cat /etc/passwd|awk -F':' '{print $3,$NF}'
      2、在/etc/passwd中显示uid数值小于3的用户
      # cat /etc/passwd|awk -F':' '{if ($3<3) print $1}'

    5.2.2 sed命令

    sed是一种流编辑器,它一次处理一行内容。

     语法:sed 选项参数 命令模式 file
     选项:
      -e:直接在指令列模式上进行sed的工作编辑
      -f:该选项会将其后文件中的脚本命令添加到已有的命令中
      -n:默认情况下,sed 会在所有的脚本执行完毕后,会自动输出处理后的内容,而该选项会屏蔽自动输出,需使用 print 命令来完成输出
      -i:此选项会直接修改原文件
     命令参数:
      a/i:在a后面新增加一行内容,在i前面新增加一行内容
      p:打印定义行的文件内容,一般与-n一起使用
      //:查找功能
      d:删除
      c:取代行内容
      s///g:全局查找替换

    5.3 printf命令

     printf命令的作用是按照我们指定的格式输出文本
     可以根据传入参数的不同,使用不同的"格式替换符"去替换。
     示例1:
     printf "%s \t %s \t %s\n" "姓名" "性别" "年龄" "小明" "男" "18" "小红" "女" "19" "小蓝" "男" "18"
     示例2:
     cat p.sh
     #!/bin/bash
     printf "\e[1;30;47m%-10s %-10s\e[0m\n" "姓名" "年龄"
     printf "\e[36;47m%-10s %-8d\e[0m\n" "小明" "18"
     printf "\e[31;47m%-10s %-8d\e[0m\n" "小红" "19"
     printf "\e[34;47m%-10s %-8d\e[0m\n" "小蓝" "19"

    5.4 shell编程

    5.4.1 计算机语言

    计算机语言包括:

    机器语言

    汇编语言

    高级语言

    高级语言包括:

    面向过程:以过程为中心的编程思想

    面向对象:主要关注对象独立完成的哪些功能

    5.4.2 什么是shell scripts?

    shell脚本就是由Shell命令组成的执行文件,将一些命令整合到一个文件中,进行处理业务逻辑,脚本不用编译即可运行。它通过解释器解释运行,所以速度相对来说比较慢。

    5.4.3 shell脚本的意义?

    shell脚本其实就是shell命令组成的文件,shell脚本可以记录命令执行的过程和执行逻辑,以便以后重复执行,还可以批量、定时处理主机,方便管理员进行设置或者管理。

    5.4.4 创建第一个shell脚本

     #!/bin/bash:主要用于指定解释器
     #:单行注释
     <<EOF...EOF:多行注释

    5.4.5 运行一个脚本

     脚本无执行权限
     方法一:sh test.sh
     方法二:. test.sh
     方法三:source test.sh
     运行有执行权限的脚本
     方法一:绝对路径# /tmp/day01/test.sh
     方法二:相对路径# ./test.sh

    5.4.6 运算符

    数值计算

     运算  shell中格式
     加法 expr $a + $b
     减法 expr $a - $b
     乘法 expr $a \* $b
     除法 expr $b / $a
     取余 expr $b % $a
     赋值 a=$b
     相等 [ $a == $b ]
     不相等 [ $a != $b ]

    算数运算指令

    1.(( ))

    我们可以直接使用双圆括弧计算其中的内容,如((var=a+b)),该指令经常在if/while等条件判断中需要计算时使用。

    2.let

    在计算表达式的时候我们可以直接使用let,如let var=a+b。

    3.expr

    在前面的内容中我们也提到了它,是非常常用的计算指令,使用时需要在外部增反引号

      var=`expr a+b`

    数值大小比较

     运算  shell中的实现   主要符号
     检测两个数是否相等 [ $a -eq $b ] -eq
     检测两个数是否不相等 [ $a -ne $b ] -ne
     检测左边的数是否大于右边的 [ $a -gt $b ] -gt
     检测左边的数是否小于右边的 [ $a -lt $b ] -lt
     检测左边的数是否大于等于右边的 [ $a -ge $b ] -ge
     检测左边的数是否小于等于右边的 [ $a -le $b ] -le

    逻辑运算

     运算  shell中的实现   主要符号
     逻辑的 AND [[ $a -lt 100 && $b -gt 100 ]] &&
     逻辑的 OR [[ $a -lt 100 || $b -gt 100 ]] ||
     非运算 not [[ ! false ]] !

    字符串运算符

     运算  shell中的实现   主要符号
     检测两个字符串是否相等 [ $a = $b ] =
     检测两个字符串是否不相等 [ $a != $b ] !=
     检测字符串长度是否为0 [ -z $a ] -z
     检测字符串长度是否不为 0 [ -n “$a” ] -n
     检测字符串是否为空 [ $a ] $

    文件测试运算符

     检测文件是否是块设备文件    [ -b $file ]    -b file
     检测文件是否是字符设备文件 [ -c $file ] -c file
     检测文件是否是目录 [ -d $file ] -d file
     检测文件是否是普通文件(既不是目录,也不是设备文件) [ -f $file ] 返回 true -f file
     检测文件是否是有名管道 [ -p $file ] -p file
     检测文件是否可读 [ -r $file ] -r file
     检测文件是否可写 [ -w $file ] -w file
     检测文件是否可执行 [ -x $file ] -x file
     检测文件是否为空(文件大小是否大于0) [ -s $file ] -s file
     检测文件(包括目录)是否存在 [ -e $file ] -e file

    5.4.7 控制语句

    if语句结构

    分支if语句

     if condition
     then
        command1
        command2
        ...
        commandN
     fi

    单分支if语句

     if condition
     then
        command1
     else
        command2
     fi

    多分支if语句

     if condition1
     then
        command1
     elif condition2
     then
        command2
     else
        command3
     fi

    循环

    for循环

     for var in item1 item2 ... itemN
     do
        command1
        command2
        ...
        commandN
     done

    示例1:1-10之间数字的和

     #!/bin/bash
     num=0
     for i in `seq 10`
     do
      let sum=$sum+$i
     done
     echo $sum

    while循环

     while condition
     do
        command
     done

    示例:1-10之间数字的和

     #!/bin/bash
     num=0
     while ((i<=10))
     do
      let num+=i
      let i++
     done
     echo $num

    无限循环(死循环)

     while true
     do
        command
     done

    跳出循环

    在循环过程中,有时候需要在未达到循环结束条件时强制跳出循环,Shell使用两个命令来实现该功能:break和continue。

    break跳出循环

     #!/bin/bash
     var=1
     while(( $var < 5 ))
     do
            if(( $var>3 ))
            then
                  echo "跳出循环"
                  break
            fi
            echo "$var"
            var=`expr $var + 1`
     done

    continue跳出本次循环

     #!/bin/bash
     var=1
     while(( $var < 5 ))
     do
            if(( $var>3 ))
            then
                  echo "跳出循环"
                  continue
            fi
            echo "$var"
            var=`expr $var + 1`
     done

    使用continue跳出的循环只是当前循环,无法跳出整个循环,由于在该代码中我们每次执行到continue就会跳出当前循环,无法执行 var=expr $var + 1,所以循环条件一直成立,就成了死循环。

    5.4.8 case语句

     case 值 in
     模式1)
        command1
        command2
        ...
        commandN
        ;;
     模式2)
        command1
        command2
        ...
        commandN
        ;;
        *)
        command1
     esac

    示例

     #!/bin/bash
     
     echo '
            1:苹果
            2:香蕉
            3:西瓜'
     
     read -p "please input a number(1-9):" num #打印信息提示用户输入,输入信息赋值给num变量
     
     case "$num" in
        1)
            echo "The number is 苹果"
        ;;
        2)
            echo "The number is 香蕉"
        ;;
        3)
            echo "The number is 西瓜"
        ;;
        *)
            echo "please reinput"
            exit 1
     esac

    5.5 shell脚本的跟踪与调试

    运行脚本前,检查脚本文件是否存在问题

     # sh [参数]
     -n : 进行shell脚本的语法检查
     -x : 实现shell脚本逐条语句的跟踪
     
  • 相关阅读:
    使用脚本改变树控件的行为 (转)点文本 收..
    (面包屑)SiteMapPath控件简化Web网站导航 (转)
    Web.config详解(转)
    SiteMap(站点地图)示例(转)
    url传递中文的解决方案总结(转)
    INI文件编程,WINAPI函数WritePrivateProfileString,GetPrivateProfileString(转帖)
    hdu 2708
    hdu 1709
    hdu 1045
    hdu 2714
  • 原文地址:https://www.cnblogs.com/weidongliu/p/16701848.html
Copyright © 2020-2023  润新知