首页 > 代码库 > shell 脚本编程基础

shell 脚本编程基础

一.编程基础

             程序:指令+数据

             程序编程风格:

                过程式:以指令为中心,数据服务于指令

                对象式:以数据为中心,指令服务于数据

             shell程序:提供了编程能力,解释执行

        1.程序的执行方式

             计算机:运行二进制指令;

             编程语言:

                低级:汇编

                高级:

                编译:高级语言–>编译器–>目标代码

                    java,C#

                解释:高级语言–>解释器–>机器代码

                    shell, perl, python

        2.编程基本概念

                 编程逻辑处理方式:

                    顺序执行

                    循环执行

                    选择执行

                 shell编程:过程式、解释执行

                 编程语言的基本结构:

                    数据存储:变量、数组

                    表达式: a + b

                    语句:if

        3.编程程序语言分类

             强类型:定义变量时必须指定类型、参与运算必须符合类型

                要求;调用未声明变量会产生错误

                如 java,python

             弱类型:无须指定类型,默认均为字符型;参与运算会自动

                进行隐式类型转换;变量无须事先定义可直接调用

                如: bash 不支持浮点数

             变量命名法则:

                1、不能使程序中的保留字:例如if, for;

                2、只能使用数字、字母及下划线,且不能以数字开头

                3、见名知义

                4、统一命名规则:驼峰命名法(单词首字母大写)

                  小驼峰法(仅开头的单词首字母大写)

二.shell脚本基础

         shell脚本是包含一些命令或声明,并符合一定格式的文本文件

         格式要求:首行shebang机制

            #!/bin/bash      ———–》 指定解释器

            #!/usr/bin/python

            #!/usr/bin/perl

          注释:   单行注释 :    #注释内容

            多行注释:      :<<EOF     注释内容       EOF

          shell脚本的用途有:

                 自动化常用命令

                 执行系统管理和故障排除

                 创建简单的应用程序

                 处理文本或文件

    2 创建shell脚本

             第一步:使用文本编辑器来创建文本文件

             第一行必须包括shell声明序列: #!

                #!/bin/bash

                 添加注释

                注释以#开头

             第二步:运行脚本

                 给予执行权限,在命令行上指定脚本的绝对或相对路径

                 直接运行解释器,将脚本作为解释器程序的参数运行

        执行分类以及区别:

            1:   。或者source script_name.sh  :

                 在当前bash中执行脚本,脚本中的变量可以调用

            2:   chmod +x后 直接执行 script_name.sh :

           调用一个新的bash子进程来执行脚本,脚本中的变量无法再父shell中使用

            3:   bash script_name.sh  :  同上

     3 脚本调试

          bash -n /path/to/some_script

            检测脚本中的语法错误

          bash -x /path/to/some_script

            调试执行

三.变量

    1.变量:命名的内存空间

            数据存储方式:

            字符:

            数值:整型,浮点型

           变量:变量类型

           作用:

            1、数据存储格式

            2、参与的运算

            3、表示的数据范围

           类型:

            字符

            数值:整型、浮点型

            注: bash中不支持浮点型,默认视为 字符 型

            涉及数学运算时,应该注意强制声明类型

    2.bash中变量的种类

          根据变量的生效范围等标准:

            本地变量:生效范围为当前shell进程;对当前shell之外

                的其它shell进程,包括当前shell的子shell进程均无效

            环境变量:生效范围为当前shell进程及其子进程

            局部变量:生效范围为当前shell进程中某代码片断(通常

                指函数)

            位置变量: $1, $2, …来表示,用于让脚本在脚本代码

                中调用通过命令行传递给它的参数

            特殊变量:  $?  命令执行状态码

            $0: 命令本身

                  $*: 传递给脚本的所有参数,全部参数合为一个字符串

                $@: 传递给脚本的所有参数,每个参数为独立字符串

                $#: 传递给脚本的参数的个数

                $@ $* 只在被双引号包起来的时候才会有差异

    3.变量类型强制声明:

                 declare option value_name=value

            -a   indexed arrays  索引

            -A  arrays   数组

            -i    integer 整数

            -r    只读

            -x   环境变量

            -f   声明函数

    4 .本地变量

             变量赋值: name=‘value’,

                 可以使用引用value:

                (1) 可以是直接字串; name=“root"

                (2) 变量引用: name="$USER"

                (3) 命令引用: name=`COMMAND`, name=$(COMMAND)

             变量引用: ${name}, $name

                "":弱引用,其中的变量引用会被替换为变量值

                ‘‘:强引用,其中的变量引用不会被替换为变量值,而保

                持原字符串

             显示已定义的所有变量: set

             删除变量: unset name

    5.环境变量

             变量声明、赋值:

                export name=VALUE

                declare -x name=VALUE

             变量引用: $name,  

                ${name}   (当变量后边含有其他字符时候需要此格式)

                eg:   a = b${c}d

             显示所有环境变量:

                export

                env

                printenv

         删除: unset name  (当变量不再需要使用时,应及时释放变量以节省空间)

         bash有许多内建的环境变量: PATH, SHELL, USRE,UID,

                 HISTSIZE, HOME, PWD, OLDPWD, HISTFILE, PS1

    6.只读和位置变量

         只读变量:只能声时,但不能修改和删除,仅退出登录时才释放

                readonly name

                declare -r name

         位置变量:在脚本代码中调用通过命令行传递给脚本的参数

                $1, $2, …:对应第1、第2等参数, shift [n]换位置

                $0: 命令本身

                $*: 传递给脚本的所有参数,全部参数合为一个字符串

                $@: 传递给脚本的所有参数,每个参数为独立字符串

                $#: 传递给脚本的参数的个数

                $@ $* 只在被双引号包起来的时候才会有差异

            示例:判断给出的文件的行数

                linecount="$(wc -l $1| cut -d‘ ‘ -f1)"

                echo "$1 has $linecount lines."

三.算术运算

     1. bash中的算术运算:help let

            +, -, *, /, %取模(取余) , **(乘方)

          实现算术运算:

            (1) let var=算术表达式

            (2) var=$[算术表达式]

            (3) var=$((算术表达式))

            (4) var=$(expr arg1 arg2 arg3 …)

            (5) declare –i var = 数值

            (6) echo ‘算术表达式’ | bc

                 乘法符号有些场景中需要转义, 如*

             (7)expr N +/-  M  也可以用于计算,后面接参数,需要空格

                        % * 等需要加 \ 转义

                  (仅能用于计算整数,否则会报错,可以用于检测是否为整数)

         bash有内建的随机数生成器: $RANDOM( 1-32767)

        echo $[$RANDOM%50] : 0-49之间随机数

    2.赋值

         增强型赋值:(注:仅支持let)

            +=, -=, *=, /=, %=

             let varOPERvalue

            例如:let count+=3

            自加3后自赋值

         自增,自减:

            let var+=1

            let var++

            let var-=1

            let var–

            let var=++1    先自加1再使用

            let var=1++    先使用再自加1

     3.逻辑运算

            true, false

                1, 0

            与:

                1 与 1 = 1

                1 与 0 = 0

                0 与 1 = 0

                0 与 0 = 0

            或:

                1 或 1 = 1

                1 或 0 = 1

                0 或 1 = 1

                0 或 0 = 0

     4.逻辑运算

             非:!

                ! 1 = 0

                ! 0 = 1

    5. 短路运算:

            短路与:(&&)

                第一个为0,结果必定为0;

                第一个为1,第二个必须要参与运算;

            短路或:(  | |  )

                第一个为1,结果必定为1;

                第一个为0,第二个必须要参与运算;

             异或: ^

                异或的两个值,相同为假,不同为真

    6.聚集命令

            有两种聚集命令的方法:

                 复合式: date; who | wc -l

                    命令会一个接一个地运行

                    (此处先执行date ,   再执行  who | wc -l )

                 子shell: (date; who | wc -l ) >>/tmp/trace

                    所有的输出都被发送给单个STDOUT和STDERR

    7.退出状态

             进程使用退出状态来报告成功或失败

                 0 代表成功, 1-255代表失败

                 $? 变量保存最近的命令退出状态

             例如:

                $ ping -c1 -W1 hostdown &> /dev/null

                $ echo $?

    8.退出状态码

             bash自定义退出状态码

                exit [n]:自定义退出状态码;

                注意:脚本中一旦遇到exit命令,脚本会立即终止;终止退出

            状态取决于exit命令后面的数字

                注意:如果未给脚本指定退出状态码,整个脚本的退出状态码

                取决于脚本中执行的最后一条命令的状态码


shell 脚本编程基础