编程基础
程序:
程序:算法+数据结构
数据:程序的核心
数据结构:数据在计算机中的类型和组织方式
算法:处理数据的方式
编程风格:
过程式:以指令为中心,数据服务于指令
对象式:以数据为中心,指令服务于数据
程序的执行方式:
计算机:执行二进制指令
编程语言:
低级编程语言:
机器:二级制序列,机器指令
汇编:采用一些助记符号替代机器指令
高级编程语言:
编译型:高级语言->编译器->机器代码->执行(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变量:
*只读变量:只能声明,但不能修改和删除。
声明: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中
2.编写脚本/root/bin/nologin.sh和login.sh,实现禁止和允许普通用户登录系统
3.编写脚本/root/bin/disk.sh,显示当前硬盘分区中空间利用率最大的值