bash脚本编程

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了bash脚本编程相关的知识,希望对你有一定的参考价值。

(一)、变量、变量类型

shell编程:


编译器,解释器

编程语言:机器语言、汇编语言、高级语言


静态语言:

    编译型语言,强类型(使用前必须先声明,甚至需初始化,数值-0,字符串-NULL),事先转换成可执行格式,C、C++、JAVA、C#

动态语言:

    解释型语言,弱类型(变量用时声明,可直接用,甚至不区分类型,默认为字符串类型),边解释边执行,php、shell、Python、Perl


面向过程:shell、C

    控制结构

        顺序结构

        选择结构:

            if语句:单分支、双分支、多分支

        循环结构

面向对象:JAVA、Python、Perl、C++


变量:命名的内存空间

内存:编址的存储单元

变量赋值:[set] VAR_NAME=VALUE

撤销变量:unset VAR_NAME

变量名称:

    只能包含字母、数字和下划线,并且不能以数字开头;

    不应该跟系统中已有的环境变量重名;

    最好做到见名知意


查看当前shell中变量:set

查看当前shell中环境变量:printenv,env,export


变量类型:事先确定数据的存储格式和长度

    字符型:每一个字符都是一个ASCII码(范围为000-255),一个ASCII码长度为8位即一个字节

    数值型:整型、浮点型

    布尔型:ture/false


逻辑运算:与&、或|、非!、异或


溢出:溢出的部分可能占用其他程序的内存,导致其他程序无法正常运行。所以需要通过变量类型来判断是否溢出


bash变量类型:

    环境变量

        定义方法:export VAR_NAME=VALUE(导出),作用域为当前shell进程及其子进程

    本地变量(局部变量)

        本地变量:VAR_NAME=VALUE,作用域为整个bash进程

        局部变量:local VAR_NAME=VALUE,作用域为当前代码段

        引用变量:${VAR_NAME}({ }可省略,引用过程中需要变换变量内容时{ }不能省略)

    位置变量:

        $1,$2,...$n(脚本执行时其后所跟的第n个参数)

        shift [n]:轮替,默认轮替单位为1

    特殊变量:bash内置的,用来保存某些特殊数值的变量

        $?:上一个命令的执行状态返回值

            程序执行,可能有两类返回值:

            ˙程序执行结果

            ˙程序状态返回代码(0-255):0-正确执行,1-255-错误执行(1,2,127系统预留)

                # exit 错误码:退出脚本(错误码自定义)

        $#:参数个数

        $*:参数列表

        [email protected]:参数列表

        $0:当前执行shell脚本的程序名

脚本在执行时会启动一个子shell进程:

    命令行中启动的脚本会继承当前shell环境变量

    系统自动执行的脚本(非命令启动)就需要自我定义各环境变量


脚本:命令的堆砌,按实际需要,结合命令流程控制机制实现的源程序


(二)、条件判断(if语句)

bash中如何实现条件判断?

    条件测试类型:

        整数测试

        逻辑测试

        字符测试

        文件测试

    条件测试的表达式:(expression代表条件测试内容,即数值比较)

        [ expression ]

        ` expression `

        test expression


条件测试:

整数比较:(双目操作)

    -eq:相等

    -ne:不等

    -gt:大于

    -lt:小于

    -ge:大于或等于

    -le:小于或等于

文件测试:

-e FILE:测试文件是否存在

-s FILE:测试文件是否非空

-f FILE:测试文件是否为普通文件

-d FILE:测试指定路径是否为目录

-r/w/x FILE:测试当前用户对指定文件是否有读/写/执行权限

-b/c/L/p/S FILE:测试指定文件是否为块设备/字符设备/符号链接/管道/套接字文件

-u/g/k FILE:测试文件是否拥有SUID/SGID/SBIT权

命令间的逻辑关系:

    逻辑与:&&,前者为真时才执行后者,前者为假时不执行后者(如果...就...)

    逻辑或:||,前者为真时不执行后者,前者为假时才执行后者(如果不...就...)

    命令1 && 命令2 || 命令3:如果命令1成立,则执行命令2,否则执行命令3

字符串测试:

    ==:等于

    !=:不等

    >/<:大于/小于

    -n string:测试指定字符串是否为空

    -s string:测试指定字符串是否不空


条件判断,控制结构:(非0值对于if语句来说都为假)

单分支if语句双分支if语句多分支if语句

if 判断条件

then

    statement1

    statement2

    ...

fi

if 判断条件;then

    statement1

    ...

else

    statement2

    ...

fi

if 判断条件1;then

    statement1

    ...

elif 判断条件2;then

    statement2

    ...

else

    statement3

fi

测试脚本是否有语法错误:# bash -n SH_NAME

有时错误无法检测出来:# bash -x SH_NAME    (单步执行,详细列出所执行的脚本过程,便于分析)


shell中如何进行算数运算:A=3,B=6

    let 算数运算表达式    let C=$A+$B

    $[算数运算表达式]    C=$[$A+$B]

    $((算数运算表达式))    C=$(($A+$B))

    expr 算数运算表达式  表达式中各操作数及运算符间要有空格,且要使用命令引用

        C=`expr $A + $B`    C=$(expr $A + $B)


(三)、循环结构(for语句)

循环:进入条件、退出条件

    for、while、until


for循环while循环:适用于循环次数未知的场景until循环

for 变量 in 列表;do

    循环体

done

(遍历完成之后退出)

for (( expr1 ; expr2 ; expr3 ));do

    循环体

done

while CONDITION;do

    statement

    ...

done

(条件满足就循环,不满足就退出)

until CONDITION;do

    statement

    ...

done

(条件不满足就循环,满足就退出)

while的特殊语句:

    while :;do                  while read LINE;do

        语句                        语句(每次执行/path/to/somefile文件中的一行)

    done(不停止循环)          done < /path/to/somefile


如何生成列表:

    `seq 起始数 步长 结束数`


quit:退出脚本

break:提前退出循环

continue:提前结束本轮循环体而进入下一轮循环


(四)、组合测试条件

    -a:与关系

    -o:或关系

    !:非关系


if [ $# -lt 8 -a $# -gt 1 ]等同于if [ $# -lt 8 ] && [ $# -gt 1 ]


(五)、多分支条件测试(case语句)


case SWITCH in

value1)

    statement

    ...

    ;;

value2)

    statement

    ...

    ;;

*)

    statement

    ...

    ;;

esac


(六)、函数


函数:功能,function

    实现代码重用

    库 .so


定义一个函数:

  function FUNCNAME {

    command

  }

  FUNCNAME() {

    command

  }

自定义执行状态返回值:

  return #(0-255)


※条件语句可以直接接收COMMAND,无需加反引号,加反引号输出的是echo信息;不加反引号代表直接判断命令的状态信息,即返回信息($?),0代表真,非0为假。



(七)、脚本编程知识点


变量中字符的长度:

  ${#VARNAME}


变量赋值:

  ${parameter:-word}:如果parameter为空或未定义,则变量展开为"word";否则,展开为parameter的值

  ${parameter:+word}:如果parameter为空或未定义,不做任何操作;否则,展开为"word"值

  ${parameter:=word}:如果parameter为空或未定义,则变量展开为"word",并将展开后的值赋值给parameter

  ${parameter:offset}:取子串,从offset处的后一个字符开始,取全部剩余子串

  ${parameter:offset:length}:取子串,从offset处的后一个字符开始,取length长的子串


脚本配置文件:

  /etc/rc.d/init.d/服务脚本

  服务脚本支持配置文件:

    /etc/sysconfig/服务脚本同名的配置文件

  

局部变量:

  local VAR_NAME=


命令mktemp:创建临时文件或目录

  # mktemp /tmp/file.XXX

    -d:创建为目录


信号:

  # kill -SIGNAL PID    (向PID进程发送SIGNAL信号)

    1:HUP

    2:INT

    9:KILL

    15:TERM

脚本中,能实现信号捕捉,但9和15无法捕捉

  # trap 'COMMAND1;COMMAND2;...' 信号列表

    一行执行多个语句,语句间用分号分隔



以上是关于bash脚本编程的主要内容,如果未能解决你的问题,请参考以下文章

bash脚本编程

linux shell编程bash编程shell教程bash教程shell文档bash文档shell脚本bash脚本教程第一部分:绪论

bash脚本编程

通过 bash 脚本将 bash 脚本添加到 crontab

Bash脚本编程总结

如何执行bash脚本时,显示行数