shell脚 本编程

1、shell脚本语言node

    1.编程语言的分类:python

(1)根据运行方式正则表达式

     编译运行:源代码 --> 编译器 (编译)--> 程序文件;shell

     解释运行:源代码 --> 运行时启动解释器,由解释器边解释边运行;编程

(2)根据其编程过程当中功能的实现是调用库仍是调用外部的程序文件:bash

      shell脚本编程:利用系统上的命令及编程组件进行编程;编程语言

       完整编程:利用库或编程组件进行编程;ide

(3)编程模型:测试

      过程式编程语言:以指令为中心来组织代码,数据是服务于代码;ui

         顺序执行选择执行循环执行表明:C,bash

      面向对象的编程语言:以数据为中心来组织代码,围绕数据来组织指令;

类(class):实例化对象,method;

表明:Java, C++, Python

总结:shell脚本编程过程式编程,解释运行,依赖于外部程序文件运行;

    2.shell脚本格式和规范

        (1)第一行,顶格:给出shebang,解释器路径

   用于指明解释执行当前脚本的解释器程序文件

常见的解释器:

#!/bin/bash#!/usr/bin/python#!/usr/bin/perl

        (2)注释信息:#

#description:#version#author#date

        (3)代码注释:

        (4)缩进,适度添加空白行;

        (5)txt格式文本文档

    3.shell脚本本质:命令的堆积;

          多命令不具备幂等性,须要用程序逻辑来判断运行条件是否知足

    4.运行脚本方法

        (1)赋予执行权限,并直接运行此程序文件;

    1)chmod +x /PATH/TO/SCRIPT_FILE

         (此处直接+x是赋予所有用户可执行权限)

    2)/PATH/TO/SCRIPT_FILE

        (2)直接运行解释器,将脚本以命令行参数传递给解释器程序;

bash /PATH/TO/SCRIPT_FILE

    (此方法和脚本本省有无执行权限无关)

    注意:1)脚本中的空白行会被解释器忽略;

       2)空白行表示:加一行echo,则显示为空白行

      3)注释行除shebang,余下全部以#开头的行,都会被视做)注释行而被忽略

       4)shell脚本的运行是经过运行一个子shell进程实现的;

 

 

 

 

2、算数运算

    1.算数符号:   +,-,*,/,  **, %

    2.加法运算格式

         (1) let  VAR=算术运算表达式

         (2) VAR=$[算数运算表达式]

         (3) VAR=$((算数运算表达式))

         (4) expr命令 :VAR=$(expr $ARG1 $OP $ARG2)

       注意:乘法符号(*)在有些场景中须要使用转义符防止和通配符、正则表达式冲突

    3.加强型赋值:变量作某种算术运算后回存至此变量中

(1)let i=$i+#    let i+=#

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

(2)自增

VAR=$[$VAR+1]let  VAR+=1let  VAR++

(3)自减

VAR=$[$VAR-1]let  VAR-=1let  VAR--

 

 

 

3、传递参数

  1.位置参数变量

      (1)# myscript.sh  argu1 argu2

 引用方式:$1,  $2, ..., ${10}, ${11}, ...

    $1:第一个输入参数

    $2第二个传递的参数

   当两位数时要用括号括起来${10}, ${11}, ..

      (2)轮替机制:调用n个位置变量

       shift   [n]:位置参数轮替;每次剔除n个,默认为1

 2.特殊变量

$0 脚本自己路径

$#脚本参数的个数

$*显示全部参数,各参数读成多个独立字符串

$@显示全部参数,各参数读成一个完整的字符串形式

 3.read用户交互经过键盘输入数据,从而完成变量赋值操做

read [option]... [变量name ...] 

  -p 'PROMPT'  显示提示信息

  -t TIMEOUT   超出时间提早结束

time out and return failure if a complete line of input is not read withint TIMEOUT seconds.

注意:通常输入以空格做为分隔符,但时当输入数量大于变量是,最后多余的所有赋予最后一个变量

wKiom1apwgiiz1CmAABuLJo5m8E730.jpg

 

 

 

4、条件测试

  1.条件测试:判断某需求是否知足,须要由测试机制来实现

  2.测试表达式编写语法

(1)执行命令,并利用命令状态返回值来判断;

0:成功

1-255:失败

(2)测试表达式

test  EXPRESSION

[ EXPRESSION ]

` EXPRESSION `

       注意:EXPRESSION两端必须有空白字符,不然为语法错误;

  3.bash的测试类型

      (1)数值测试:数值比较,双目测试

-eq:是否等于; [ $num1 -eq $num2 ]

-ne:是否不等于;

-gt:是否大于;

-ge:是否大于等于;

-lt:是否小于;

-le:是否小于等于;

      (2)字符串测试:双目测试

==:是否等于;

>:是否大于;

<:是否小于;

!=:是否不等于;

=~:左侧字符串是否可以被右侧的PATTERN所匹配;

-z "STRING":判断指定的字串是否为空;空则为真,不空则假;

-n "STRING":判断指定的字符串是否不空;不空则真,空则为假;

注意:

     1)字符串要加引用;

$变量时候,要" ",防止变量空值时候,比较两边类型不一致会报错

     2)最好要使用` `;但多个条件逻辑关系时可能要用[  ]

      (3)文件测试:通常为单目测试,存在为真,不存在未假

   1)文件存在性测试:

-a  FILE

-e  FILE

   2)存在性及类型测试:

-b    FILE:是否存在而且为 块设备 文件;

-c  FILE:是否存在而且为 字符设备 文件;

-d  FILE:是否存在而且为 目录文件;

-f  FILE:是否存在而且为 普通文件;

-h  FILE或 -L  FILE:是否存在而且为 符号连接文件;

-p FILE:是否存在且为 命名管道文件;

-S  FILE:是否存在且为 套接字文件;

   3)文件权限测试:

-r  FILE:是否存在而且 对当前用户可读;

-x  FILE:是否存在而且 对当前用户可执行;

-w  FILE:是否存在而且 对当前用户可写;

   4)特殊权限测试:

-u  FILE:是否存在而且 拥有suid权限;

-g  FILE:是否存在而且 拥有sgid权限;

-k  FILE:是否存在而且 拥有sticky权限;

   5)文件是否有内容:

-s  FILE:是否有内容;

   6)时间戳测试:

-N FILE:文件自从上一次读操做后是否被修改过;

   7)从属关系测试:

-O  FILE:当前用户是否为文件的属主;

-G  FILE:当前用户是否属于文件的属组;

   8)双目测试:

FILE1  -ef  FILE2:是否指向同一个文件系统的相同inode的硬连接;

FILE1  -nt  FILE2:FILE1是否新于FILE2;

FILE1  -ot  FILE2:FILE1是否旧于FILE2;

 4.组合测试条件:逻辑运算

(1)第一种方式:

COMMAND1 && COMMAND2

COMMAND1 || COMMAND2

! COMMAND

[ -O FILE ] && [ -r FILE ]

(2)第二种方式:

EXPRESSION1  -a  EXPRESSION2

EXPRESSION1  -o  EXPRESSION2

! EXPRESSION

[ -O FILE -a -x FILE ]

  5.脚本的状态返回值

         (1)默认是脚本中执行的最后一条件命令  的状态返回值

         (2)自定义状态退出状态码

exit [n]n为本身指定的状态码

注意:shell进程遇到exit时,即会终止,所以,整个脚本执行即为结束;

  6.脚本检测&调试

bash -n /path/to/some_script  检测脚本中的语法错误不能检出出逻辑错误

bash -x /path/to/some_script  调试执行,显示过程