zoukankan      html  css  js  c++  java
  • Linux Shell脚本编程-基础1

    概述:
      shell脚本在Linux系统管理员的运维工作中非常重要。shell脚本能够帮助我们很方便的管理服务器,因为我们可以指定一个任务计划,定时的去执行某一个脚本以满足我们的需求。本篇将从编程基础、脚本基本格式、变量、运算、条件测试这几个方面详细介绍shell脚本编程的基础内容,也是我们必须要掌握熟练的内容。

      编程语言:事先定义了一组规范,通过关键字按照特定的语法结构编写出来的程序,通过编译器或解释器转换成汇编程序
      程序执行逻辑:顺序执行,至上而下;选择执行(条件判断);循环执行
      动态语言:解释型语言,变量随时申明随时分配内存空间,不能合理分配内存空间(perl、bash、python)
      静态语言:编译型语言,所有的变量在程序执行之前都要分配好内存空间,变量必须手动释放,合理分配内存空间

    Shell脚本
    shell编程:过程式编程,解释执行,依赖于外部程序文件运行;是一个过程式的解释器,提供了编程能力,然后解释执行。
      编程语言的基本结构:
      数据存储:变量、数组
      表达式:a + b、a=1
      语句:if语句

      常见解释器:
      #!/bin/bash
      #!/usr/bin/python
      #!/usr/bin/perl

    shell脚本的用途有:
      自动化常用命令
      执行系统管理和故障排除
      创建简单的应用程序
      处理文本或文件

    shell脚本调试:
      检测脚本中的语法错误
      bash -n /path/to/some_script
      调试执行(单步执行)
      bash -x /path/to/some_script

    shell脚本的执行方式:
      1、相对路径执行(需要执行权限):./some_script
      2、绝对路径执行(需要执行权限):/path/to/some_script
      3、命令行执行(不需要执行权限):bash /path/to/some_script
      4、.执行(不需要执行权限):. /path/to/some_script
      5、source命令执行(不需要执行权限):source /tmp/scriptname

      总结:方法3、4、5不需要执行权限是因为脚本是作为命令的参数去执行的。前3种方法执行shell脚本时都是在当前shell下(称为父shell)开启一个子shell环境,此shell脚本就在这个子shell环境中执行;shell脚本执行完后子shell环境随即关闭,然后又回到父shell中(因为执行完后子shell已退出,shell脚本中得变量也会被释放掉)。第4、5种则是在当前shell中执行(脚本中的变量不会被释放)

    bash脚本中的变量
    变量:
      数据存储格式:ASCII(一个字符占用8bit)、Binary(二进制)
      按照其变量是否需要严格定义其类型来划分
      强类型语言:事先需要定义变量存储类型的如C
      弱类型语言:无需定义变量存储类型,bash默认所有变量都认为字符存储格式
      定义变量类型的作用:数据存储格式、数据的有限存储范围、比较机制不同、参与的运算类型不同

    变量类型:分为两大类字符型和数值型
      字符型:
      数值型:正 负
      精确数值型:整数
      近似数值型:
        浮点数:
        单精度:
        双精度:
        布尔型:真与假

    bash变量的类型:
      本地变量:作用域为整个bash进程,只对当前shell进程有效,对其子shell以及其他shell都无效
      定义变量 set Var_Name="Value"

      局部变量:作用域为当前代码段,只对某一部分有效(在函数中会用到)
      定义变量 local Var_Name="Value"

      位置变量:通过位置变量引用脚本名称和脚本执行后面指定的参数$0......$n
      $0 表示脚本名称
      $1 表示执行脚本后面指定的第一个参数,$2指定的第二个参数;后面依次类推

      位置参数轮替shift
      在脚本给定的位置参数不确定,脚本求给定数字的和,但是给定的数字个数不确定;这个时候用到shift位置轮替,位置轮替的意思类似$1剔除,原来的$2变为$1,循环一次剔除一次,如果后面跟数值就是剔除几个位置变量默认不加数值就是剔除一个
    #!/bin/bash
    sum=0
    for i in `seq 1 $#`;do
      let sum+=$1
    shift
    done
    echo $sum

      特殊变量:
      $? 上一条命令的执行状态码,状态码用0-255数字表示;0表示执行成功,1-255表示失败;1、2、127、255预留
      $# 传入脚本的参数的个数
      $* 传给脚本的所有参数(所有参数作为一个字符串)
      $@ 传给脚本的所有参数是列表方式(每个参数都作为独立的字符串)
      $$ 当前shell程序的PID
      $! 后台运行的最后一个作业的PID
      $- 显示shell当前使用的选项(通过set命令开启和关闭的shell选项)
      $_ 上一条命令的最后一个参数

      注意:$*和 $@都表示传递给函数或脚本的所有参数,不被双引号(" ")包含时,都以"$1" "$2" … "$n" 的形式输出所有参数。但是当它们被双引号(" ")包含时,"$*" 会将所有的参数作为一个整体,以"$1 $2 … $n"的形式输出所有参数;"$@" 会将各个参数分开,以"$1" "$2" … "$n" 的形式输出所有参数

      环境变量:作用域为当前shell进程及其子shell有效(反过来子shell定义的环境变量对父shell没效)
      定义变量  export Var_Name="Value"
      或下面方式先定义本地变量在通过export导出为环境变量
        Var_Name="Value"
        export Var_Name

      bash的内置环境变量:用来定义bash的工作特性,用于保存当前会话的属性信息
      $PATH      命令的搜寻路径
      $HOSTNAME    显示主机名
      $HISTFILE    设定命令历史文件的路径文件名
      $HISTSIZE     定义了history命令能记录命令最大数
      $HISTFILESIZE  设定命令历史文件存储命令的最大数
      $HISTCONTROL   控制命令是否存入命令历史文件中
      $BASH      bash二进制程序文件的路径
      $BASH_SUBSHELL 子shell的层次
      $BASH_VERSION bash程序的版本
      $EDITOR     系统默认编辑器
      $EUID      有效的用户ID(运行进程的实际用户ID)
      $UID      当前用户的ID号
      $FUNCNAME    当前函数的名称
      $GROUPS     当前用户所属的组
      $HOME      当前用户的家目录
      $HOSTTYPE    主机类型,用来识别系统硬件平台
      $MACHTYPE    平台类型(硬件平台-发布版本-OS类型)
      $OSTYPE     OS类型
      $OLDPWD     上一次的工作目录
      $PWD       当前工作目录
      $IFS       输入数据时字段分隔符,默认为空白符(空格、制表符、换行符)
      $PPID      父进程的进程号
      $PS1       登陆主提示符
      $PS2       第二提示符,补充完全命令输入时的提示符(默认为>)
      $PS3       第三提示符,用于select命令中
      $PS4       第四提示符,当使用-x选项调用脚本时,显示的提示符,默认为+号
      $SECONDS     当前脚本已经运行的时长
      $SHLVL     shell级别,bash被嵌入的深度

      引用变量 ${Var_Name}
      撤销变量 unset Var_Name

      变量的命名要求:只能使用数字、字母和下划线组成;不能以数字开头;不能使用程序中的关键字;见名知义
      set 不带任何参数显示当前系统的所有变量
      export 不带任何参数显示所有环境的变量(env、printenv)

      declare 定义变量类型
        -i 声明整形变量
        -x 声明环境变量,类似于export
        -a 声明数组
        -f 声明函数
        -r 声明只读变量,相当于readonly(不能撤销变量及修改变量的值),shell程序终止才会消失
        name=king ; readonly name或者declare -r name=king都表示声明只读变量

    bash配置文件
      bash的配置文件只会登录的时候读取一次,如果手动修改了bash的配置文件可以通过重新登录让配置生效,或者通过source或.重读bash的配置文件其实就是通过source或.重新执行了配置文件
      例子:source ~/.bashrc 或者 . ~/.bashrc 
      shell类型:
      登录式shell:
        通过终端输入用户信息登陆系统
        su - UserName或su -l UserName或su --login UserName
      非登录shell:
        su UseName
        图形界面下打开的终端
        执行脚本(执行脚本前会先读取bash的配置文件)

      bash配置文件详解:
      profile类:登录式shell提供配置
      profile类功能:设定环境变量、运行命令或者脚本
        /etc/profile     全局
        /etc/profile.d/*.sh 全局
        ~/.bash_profile   个人配置,仅对当前用户有效
      登录式shell读取配置文件顺序
      /etc/profile—>/etc/profile.d/*.sh—>~/.bash_profile—>~/.bashrc—>/etc/bashrc—>~/.bash_logout

      bashrc类:非登录式shell提供配置
      bashrc类功能:设定本地变量、定义命令别名
        /etc/bashrc 全局
        ~/.bashrc  个人配置
      非登录读取配置文件顺序
      ~/.bashrc—>/etc/bashrc—>/etc/profile.d/*.sh—>~/.bash_logout

    bash算术运算
      let varName=算术表达式
      varName=$[算术表达式]
      varName=$((算术表达式))
      varName=`expr 变量1 + 变量2 `
      除法运算有余数被省略(圆整)
      操作符:+、-、*、/、%(余数)
      num=10
      let num+=2或num=$[$num+2] 将变量num加2后的值再存回变量num
      +=、-=、*=、/=、%=     这些符号和前面的例子同理
      let varName++、varName--  先引用变量在运算(+1或-1存回变量自身)
      let ++varName、--varName  每次先+1或-1存回变量自身,先运算在引用

      bash中有内建的随机数生成器
        $RANDOM 生成0-32767之间的随机数
        示例:echo $[$RANDOM%50] :0-49之间随机数(取余数肯定小于50)

    bash逻辑运算
      与运算:
      真 && 真 = 真(0)
      真 && 假 = 假
      假 && 真 = 假
      假 && 假 = 假
      或运算:
      真 || 真 = 真(0)
      真 || 假 = 真
      假 || 真 = 真
      假 || 假 = 假
      非运算:
      !真 = 假
      !假 = 真

      逻辑与:&&(两个条件都为真的时候才为真,任何一个为假就为假)
      第一个条件为假时,第二条件不用再判断,最终结果已经为假所以第二条件不执行
      第一个条件为真时,第二条件必须判断;只有第二条件执行才能得最终结果
      逻辑或:||(两个条件其中任何一个为真就为真,同时为假才为假)
      第一个条件为假时,第二条件必须判断,只有第二条件执行才能得最终结果
      第一个条件为真时,第二条件不用再判断,最终结果已经为真所以第二条件不执行

      && 命令1&&命令2 当命令1正确执行,命令2才会执行
      当命令1执行不正确,命令2不会执行
      || 命令1||命令2 当命令1执行不正确时,命令2才会执行
      当命令1正确执行,命令2不会执行

      例子:判断某条命令是否执行成功,执行成功打印yes,执行错误打印no(&&的优先级大于||,所以先执行左边的判断)
      command && echo yes || echo no
      如果命令执行成功,就执行echo yes;前面逻辑与结果为真,所以后面的echo no就不会执行
      如果命令执行不成功,就不会执行echo yes;前面逻辑与结果为假,所以后面的echo no就会执行

      如果用户user6不存在,就添加用户user6
        ! id user6 && useradd user6
        id user6 || useradd user6
      如果/etc/inittab文件的行数大于100,就显示好大的文件;
        [ `wc -l /etc/inittab | cut -d' ' -f1` -gt 100 ] && echo "Large file."

  • 相关阅读:
    第三天 moyax
    mkfs.ext3 option
    write file to stroage trigger kernel warning
    download fomat install rootfs script
    custom usb-seriel udev relus for compatible usb-seriel devices using kermit
    Wifi Troughput Test using iperf
    learning uboot switch to standby system using button
    learning uboot support web http function in qca4531 cpu
    learngin uboot design parameter recovery mechanism
    learning uboot auto switch to stanbdy system in qca4531 cpu
  • 原文地址:https://www.cnblogs.com/Link-Luck/p/9854559.html
Copyright © 2011-2022 走看看