Linux shell脚本编程

Linux shell脚本编程

一、介绍

shell的两层含义:既是一种应用程序,又是一种程序设计语言

作为应用程序:

        交互式地解释、执行用户输入的命令,将用户的操作翻译成机器可以识别的语言,完成相应功能

          作为应用程序称之为shell命令解析器。shell是用户和Linux内核之间的接口程序,用户在提示符下输入的命令都由shell先解释然后传给Linux核心它调用    了系统核心的大部分功能来执行程序、并以并行的方式协调各个程序的运行

        Linux系统中提供了好几种不同的shell命令解释器,如sh、ash、bash等。

 一般默认使用bash作为默认的解释器

作为程序设计语言:

        它定义了各种变量和参数,并提供了许多在高级语言中才具有的控制结构,包括 循环和分支完成类似于windows下批处理操作,简化我们对系统的管理与应用程序的    部署。

        作为程序设计语言称之为shell 脚本。我们学过的c/c++等语言,属于编译性语 言。shell脚本是一种脚本语言,我们只需使用任意文本编辑器,按照语法编写相应    程序,增加可执行权限,即可在安装shell命令解释器的环境下执行

 

我们只需要将所有操作写入一个文——cmd.sh(名字跟后缀可任取,为了便于区分我们一般写为*.sh形式)

二、shell脚本的定义与执行

    1、定义以开头:#!/bin/sh

        #!用来声明脚本由什么shell解释,否则使用默认shell

    2、注释:#

        单个"#"号代表注释当前行

    3、执行:三种

        (1)增加可执行权限后执行

                #chmod +x test.sh       

                ./test.sh 

        (2)#bash test.sh 直接指定使用bash解释test.sh

        (3)调用默认shell解释test.sh(.[空格]名字

                #. test.sh(source test.sh) 

    注:区别

           (1) ./和bash执行过程基本一致,后者明确指定bash解释器去执行脚本,脚本中#!指定的解释器不起作用,前者首先检测#!,使用#!指定的shell,如果没有使用默认shell

            (2)用./和bash去执行会在后台启动一个新的shell去执行脚本

            (3)用.去执行脚本不会启动新的shell,直接由当前的shell去解释执行脚本

三、变量:自定义变量、环境变量、预设变量

1.自定义变量

        (1)定义变量

            变量名=变量值

            如:num=10等号两边不能直接接空格符

        (2)引用变量

            $变量名

            如:i=$num 把变量num的值付给变量i

        (3)显示变量

            使用echo命令可以显示单个变量取值

            echo$num

        (4)清除变量

            使用unset命令清除变量

            unset变量名

        (5)变量的其它用法:

           read string

                从键盘输入一个字符串付给变量string,

                若string没定义则先定义在使用

          readonly var=100

                定义一个只读变量,只能在定义时初始化,以后不能改变,不能被清除。

           export var=300

                使用export说明的变量,会被导出为环境变量,其它shell均可使用

            注意:此时必须使用source 2_var.sh才可以生效

        (6)注意事项:

           1、变量名只能英文字母数字下划线,不能以数字开头

                1_num=10错误

                num_1=20 正确

           2、等号两边不能直接接空格符,若变量中本身就包含了空格,则整个字符串都要用双引号、或单引号括起来;双引号内的特殊字符可以保有变量特性,但是单引号内的特殊字符则仅为一般字符。

                name=aabb //错误

                name="aa bb" //正确

                echo "$name is me" //输出:aa bb is me

                echo  ' $name is me ' //输出:$name is me

            Linux shell脚本编程_第1张图片

    2. 环境变量

        (1)shell在开始执行时就已经定义了一些和系统的工作环境有关的变量,我们在shell中可以直接使用$name引用

       (2)定义:

            一般在~/.bashrc或/etc/profile文件中(系统自动调用的脚本)使用export设置,允许用户后来更改

                VARNAME=value

                export VARNAME

           传统上,所有环境变量均为大写

        (3)显示环境变量

            使用env 命令可以查看所有的环境变量。

       (4)清除环境变量

            使用unset 命令清除环境变量

                unset VARNAME

        (5)常见环境变量:

            HOME:用于保存注册目录的完全路径名。

            PATH:用于保存用冒号分隔的目录路径名,shell将按PATH变量中给出的顺序搜索这些目录,找到的第一个与命令名称一致的可执行文件将被行。

                PATH=$HOME/bin:/bin:/usr/bin;exportPATH

           HOSTNAME:主机名

           SHELL默认的shell命令解析器

           LOGNAME:此变量保存登录名

           PWD:当前工作目录的绝对路径名

        Linux shell脚本编程_第2张图片

    3. 预定义变量

        $#传给shell脚本参数的数量

        $*传给shell脚本参数的内容

        $1、$2、$3、...、$9:运行脚本时传递给其的参数,用空格隔开

        $?命令执行后返回的状态

            用于检查上一个命令执行是否正确

            0表示该命正确执行

            非0值表示命令出。

        $0当前执行的进程名

        $$当前进程的进程号

            "$$"变量最常见的用途是用作临时文件的名字,以保证临时文件不会重复

    执行 bash test.sh 1 3 5 7

4. 脚本变量的特殊用法:"" `` ' \ () {}

    ""(双引号)包含的变量会被解释

    ''(单引号):包含的变量会当做字符串解释

    ``(数字键1左面的反引号):反引号中的内容作为系统命令,并执行其内容,可以替        换输出为一个变量

        $ echo "today is `date` "

        todayis 2012年07月29日星期日 12:55:21CST

    \ 转义字符同c语言 \n \t \r \a等echo命令需加-e转义

    (命令序列)由子shell来完成,不影响当前shell中的变量

    { 命令序列 }在当前shell中执行,会影响当前变量, “{”、“}”前后有一空格

   

     Linux shell脚本编程_第3张图片Linux shell脚本编程_第4张图片

四、条件测试语句: 文件、字符串、数字、复合测试

    (1)在写shell脚本时,经常遇到的问题就是判断字符串是否相等,可能还要检查文  件状态或进行数字测试,只有这些测试完成才能做下一步动作

    (2)test命令:用于测试字符串、文件状态和数字

    (3)test命令有两种格式:

            test condition 或[ condition ]

            使用方括号时,要注意在条件两边加上空格

    (4)shell脚本中的条件测试如:文件测试、字符串测试、数字测试、复合测试

    (5)测试语句一般与后面讲的条件语句联合使用

    (6)文件测试:测试文件状态的条件表达式

        -e 是否存在 -d 是目录 -f 是文件 -r 可读 -w 可写 -x 可执行

        -L 符号连接 -c是否字符设备 -b是否块设备 -s 文件非空

        Linux shell脚本编程_第5张图片

    (7)字符串测试:

        test str_operator“str”

        test “str1” str_operator “str2”

        [ str_operator “str” ]

        [ “str1” str_operator “str2”]

        其中str_operator可以是:

        = 两个字符串相等  

        != 两个字符串不相等

         -z空串  

        -n 非空串

    (8)测试数值格式如下:

        test num1num_operator num2

        [ num1 num_operator num2 ]

        num_operator可以是:

        -eq 数值相等

        -ne 数值不相等

        -gt 数num1大于数num2

        -ge 数num1大于等于数num2

        -le 数num1小于等于数num2

        -lt 数num1小于数num2

(10)命令执行控制

        &&:command1&& command2

            &&左边命令(command1)执行成功(即返回0)

            shell才执行&&右边的命令(command2)

        ||:command1|| command2

            ||左边的命令(command1)未执行成功(即返回非0)

            shell才执行||右边的命令(command2)

        test -e /home && test -d /home&& echo "true"

 

五、控制语句

    (1)if[条件1];

            then 执行第一段程序

        else

            执行第二段程序

        fi

    (2)if [条件1];

            then执行第一段程序

        elif [条件2];

            then执行第二段程序

        else

            执行第三段程序

        fi

    (3)case $变量名称 in

            “第一个变量内容”)

                程序段一

            ;;

            “第二个变量内容”)

                程序段二

            ;;

            *)

                其它程序段

            exit 1

        esac

    (4)for (( 初始值; 限制值; 执行步阶 ))

        do

            程序段

        done

        declare是bash的一个内建命令,可以用来声明shell变量、设置变量的属性。        declare也可以写作typeset。

        declare -i s 代表强制把s变量当做int型参数运算。

       Linux shell脚本编程_第6张图片

    (5for varin con1 con2 con3 ...

            do

                程序段

            done

        第一次循环时,$var的内容为con1

        第二次循环时,$var的内容为con2

        第三次循环时,$var的内容为con3

        ......

    (6)while [condition ]

        do

            程序段

        done

        当condition成立的时候进入while循环,

        直到condition不成立时才退出循环。

    (7)until [condition ]

        do

            程序段

        done

        与while相反,当condition成立的时候退出循环,否则继续循环。

    (8)break

       break 命令允许跳出循环,通常在进行一些处理后退出循环或case语句

    (9)continue

       continue不会跳出循环,只是跳过这个循环步

六、函数

   1. 定义函数的两种格式:

        (1)函数名() {

                命令 ...

            }

        (2)function 函数名() {

                命令 ...

            }

    2.函数可以放在同一个文件中作为一段代码,也可以放在只包含函数的单独文件中

    3. 所有函数在使用前必须定义,必须将函数放在脚本开始部分

    4. 调用函数的格式为:

        函数名 param1 param2……

        使用参数同在一般脚本中使用特殊变量$1,$2 ...$9一样

    5. 函数可以使用return 提前结束并带回返回值

        return 从函数中返回,用最后状态命令决定返回值。

        return 0 无错误返回

        return 1 有错误返回

        Linux shell脚本编程_第7张图片

 

你可能感兴趣的:(Linux)