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命令后面的数字

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

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

原创文章,作者:ldt195175108,如若转载,请注明出处:http://www.178linux.com/33682

(0)
ldt195175108ldt195175108
上一篇 2016-08-12 09:01
下一篇 2016-08-12 09:01

相关推荐

  • Linux中磁盘管理与文件系统创建挂在

    磁盘管理 Linux中哲学思想:Linux一切皆文件,所有访问磁盘设备就如同访问一个文件一样,因此要想使用需要一个文件接口 如何向设备中输入数据?     首先将设备在系统上映射成一个文件,在此文件上进行读写操作就相当于对设备进行读写,对程序而言首先是打开一个文件open(),然后执行read()或者write(),最…

    Linux干货 2016-08-26
  • 8-16 Shell脚本之循环

    本节主要讲解Shell脚本的循环和软件包的管理 一、用until实现下列作业 1、每隔3秒钟到系统上获取已经登录的用户的信息;如果发现用户hacker登录,则将登录时间和主机记录于日志/var/log/login.log中,并提示该用户退出系统。 2、随机生成10以内的数字,实现猜字游戏,提示比较大或小,相等则退出 3、编写脚本,求100以内所有正整数之和 …

    Linux干货 2016-08-18
  • haproxy 实战之haproxy实现httpd负载均衡

    haproxy 实战之haproxy实现httpd负载均衡 实验目的haproxy + httpd实现负载均衡 1.准备机器,做好时间同步,域名主机名解析 192.168.42.151 [node2 haproxy] 192.168.42.152 [node3 httpd] 192.168.42.153 [node4 httpd] 2.node3,node4…

    Linux干货 2017-06-29
  • Bash shell 脚本编程全攻略(上篇)

    Bash shell 脚本编程全攻略(上篇)   什么是shell脚本呢? 当命令不在命令行上执行,而是通过一个文件执行时,该文件就称为shell脚本,脚本以非交互的方式运行。Shell脚本把命令通过一些语法组织起来,便能实现特定的功能。   Shell脚本主要运用在系统运维中,主要功能有: 自动化常用命令; 执行系统管理和故障排除; 创…

    Linux干货 2016-08-29
  • lamp的搭建

    方法一编译安装amp:   1.系统环境:CentOS 6,7       CentOS6:apr,apr-util的版本为1.3.9,不适合httpd-2.4    CentOS7:apr,apr-util的版本为1.4+2.开发环境需要安装:    Developm…

    Linux干货 2016-10-16
  • 划分子网例题

    概念:子网划分就是——>将一个大网络(主机ID位多)划分成多个小的网络(主机ID位少) 如何实现呢?!        实现——->网络ID向主机ID借位,网络ID位变多,主机ID位变少 涉及的公式:         &n…

    2017-09-04