SHELL脚本编程

编程基础

程序:

       程序:算法+数据结构

       数据:程序的核心

       数据结构:数据在计算机中的类型和组织方式

       算法:处理数据的方式

编程风格:

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

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

程序的执行方式:

       计算机:执行二进制指令

       编程语言:

              低级编程语言:

                     机器:二级制序列,机器指令

                     汇编:采用一些助记符号替代机器指令

              高级编程语言:

                     编译型:高级语言->编译器->机器代码->执行(C,C++等)

                     解释型:高级语言->执行->解释器->机器代码(python,shell等)

编译型和解释型语言

编程基本概念:

       逻辑处理:顺序执行、循环执行、选择执行

       基本结构:相关语句、数据存储、表达式

SHELL脚本基础

脚本规范:

       首行shebang机制(#!),声明脚本所调用的语言

       后续应包括以下内容:程序名、版本号、更改时间、作者相关信息、相关协议等

shell脚本用途:

       自动化常用命令

       执行系统管理和故障排除

       创建简单的应用程序

       处理文本或文件

shell脚本结构:

       #!shebang                       (shebang机制)

       Configuration_Variables      (参数变量)

       Function_Definition             (函数定义)

       Main_Code                         (主要代码)

shebang机制:

       shebang= #(sharp) + !(bang)

        #! +解释器绝对路径:用于指明执行这个脚本文件的解释器。

变量

相关概念:

       定义:变量即命名的内存空间,指明存放数据的地址(门牌号)。

       强类型:需要经过函数强制转换才能改变数据类型(Java、python等)

       弱类型:与严峻形势会隐式做数据类型转换,无需指定,默认为字符型(bash等)

       命名法则:

              不能使用程序保留字,如if、for等

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

              统一命名规则:驼峰命名法、下划线分隔命名

bash变量:

bash变量

                                      *只读变量:只能声明,但不能修改和删除。

                                                     声明:readonly name或declare –r name

                                                     查看:readonly -p

        相关命令:

                     显示变量:set(局部);env、export、declare –x、printenv(全局)

                     删除变量:unset name;set --(清空所有位置变量)

bash退出状态

        退出状态码:0代表成功;1-255代表失败(使用$?查看最近命令的退出状态)

        自定义退出状态码:exit

        num(不超过255)

        *脚本一旦遇到exit命令,会立即终止,退出状态取决于exit命令后的数字;如果未给脚本指定退出exit命令,脚本退出状态码取决于脚本执行的最后一条命令的状态码。

        *执行脚本一般直接写脚本名称或bash脚本,不使用source或. 执行,因为当脚本中存在exit命令时后两种执行方式会注销,而前两种是在创建的子进程中执行

bash运算

bash算术运算:

       命令:let、$[ ]、$(( ))、$(expr )、declare –i、echo “…“|bc

       运算符:+、-、*、/、%、**、增强型赋值(++、--、+=、-+、*=、/=、%=)

       [eg]将3*4运算结果赋值给var

              letvar=3*4;var=$[3*4];var=$((3*4));var=$(expr 3*4);

              declare –i var=3*4;var=`echo “3*4”|bc`

bash逻辑运算:

       逻辑值:true(1)、false(0)

       与或非:

              与:和1相与的保留原值、和0相与的全部为0,进行二进制转换

              或:和1相与的全部为1、和0相或的保留原值,进行二进制转换

              非:取相反逻辑值,不进行二进制转换

       短路:

              短路与:前者为0时不考虑后者

              短路或:前者为1时不考虑后者

              cmd1&&cmd2:cmd1为真时执行cmd2,为假时不执行cmd2

              cmd1||cmd2:cmd1为真时不执行cmd2,为假时执行cmd2

       异或:

              ^:异或的两个值相同为0,不同为1(同性相斥)

bash测试

条件测试:

       测试机制:判断某需求是否满足,为真返回0,为假返回1

       测试命令:test、[ expression ]、[[expression ]]

条件性执行操作符:

       &&:代表条件性的and then,等同于-a

       ||:代表条件性的or else,等同与-o

bash数值测试:

       -vvar(变量var是否设置)、-gt(大于)、-ge(大于等于)、-lt(小于)、-le(小于等于)、

       -eq(等于)、-ne(不等于)

bash字符串测试:

       =、>、<、!=、=~(左侧字符串是否能被右侧pattern匹配,一般用于[[ ]]中)

       *用于字符串比较时用到的操作数都应该使用引号,比较符号前后注意加空格

       [eg]str=abcde;[[ “$str” =~ abc?? ]]&&echo true||echo false

bash文件测试:

       存在性测试:-a(文件存在)、-e(同-a)、-b(存在且为块设备)、-c(存在且为字符设备)、

                            -f(存在且为普通文件)、-d(存在且为目录文件)、-h(存在且为链接文件)、

                            -p(存在且为命名管道文件)、-s(存在且为套接字文件)

       权限测试:-r(存在且可读)、-w(存在且可写)、-x(存在且可执行) 、-u(存在且有suid)、

                        -g(存在且有sgid)、-k(存在且有sticky)

属性测试:-s(存在且非空)、-f(文件描述符是否在某终端打开)、-O(当前用户是否属主)、

                  -G(当前用户是否属组)、-N(自上次读取后是否被修改过)

bash命令行展开

            命令行分成单个命令词->展开别名->展开大括号声明{ }->展开波浪符声明~->命令替换$( ) ->再次将命令行分成单个命令词->展开文件通配符->准备I/O重导向->运行命令

相关练习

1.编写脚本/root/bin/backup.sh,可实现每日将/etc/目录备份到 /root/etcYYYY-mm-dd中

backup.sh
执行结果

2.编写脚本/root/bin/nologin.sh和login.sh,实现禁止和允许普通用户登录系统


脚本代码
nologin.sh执行结果
login.sh执行结果

3.编写脚本/root/bin/disk.sh,显示当前硬盘分区中空间利用率最大的值

disk.sh
执行结果

你可能感兴趣的:(SHELL脚本编程)