脚本的初步了解笔记
bash脚本编程
shell编程
编程语言:机器语言 、汇编语言、高级语言
高级语言
静态语言:编译型语言
不需要借助额外的二进制程序,可以直接写代码
属于强类型的语言(变量)
事先转换成可执行格式,不需要解释器,自己就可以完成程序
属于静态语言的: C C++ java c#
问题就是容易出bug,因为是全部完成以后执行,没有校对,一旦出问题很难排查
动态语言:解释型语言
弱类型的语言:
不需要直接转换有编译器 ,边解释边执行
Asp php shell python perl
Bash:脚本解释器
面向过程:就是分析出解决问题所需要的步骤,然后用函数把这些步骤一步一步实现,使用的时候一个一个依次调用就可以了。
面向对象:是把构成问题事务分解成各个对象,建立对象的目的不是为了完成一个步骤,而是为了描叙某个事物在整个解决问题的步骤中的行为。适合开发大型应用程序
例如五子棋,面向过程的设计思路就是首先分析问题的步骤:1、开始游戏,2、黑子先走,3、绘制画面,4、判断输赢,5、轮到白子,6、绘制画面,7、判断输赢,8、返回步骤2,9、输出最后结果。把上面每个步骤用分别的函数来实现,问题就解决了。
而面向对象的设计则是从另外的思路来解决问题。整个五子棋可以分为 1、黑白双方,这两方的行为是一模一样的,2、棋盘系统,负责绘制画面,3、规则系统,负责判定诸如犯规、输赢等。第一类对象(玩家对象)负责接受用户输入,并告知第二类对象(棋盘对象)棋子布局的变化,棋盘对象接收到了棋子的i变化就要负责在屏幕上面显示出这种变化,同时利用第三类对象(规则系统)来对棋局进行判定。
可以明显地看出,面向对象是以功能来划分问题,而不是步骤。同样是绘制棋局,这样的行为在面向过程的设计中分散在了总多步骤中,很可能出现不同的绘制版本,因为通常设计人员会考虑到实际情况进行各种各样的简化。而面向对象的设计中,绘图只可能在棋盘对象中出现,从而保证了绘图的统一。
面向过程的语言:shell c语言
面向对象:java完全面对对象 python c++
变量
变量:被命名的内存空间
内存:编址的存储单元
内存在存储数据时,都会给数据编上地址方便使用时查找,虽然都是存储但是内存读取写入的的速度要比硬盘快太多了 内存作为一个短暂存储快速与cpu配合工作 然后把数据在存储在硬盘里
变量也是区分类型的,因为内存存储 一个字符和一个数值所用的空间完全不一样,一个字符占用7bit,但是一个字节最小是8bit 字符10就要占用16bit空间 而数值的10 二进制转换为1010 才占用4位 ,那么内存怎么用不同的方法给予变量空间 因此产生了不同类型的变量,以最合适的方法占用内存空间
变量类型:确定数据类型的存储格式和存储长度
不同的格式占用的内存存储空间不一样
变量类型常见的分为
字符型:
数值型:
整数型
浮点型:带小数点后面精度的 例如11.23 21.43 都是带小数的
日期时间型:最后还是会转换为字符或者数值型来进行存储
布尔型:真、假型 又称逻辑类型
例1+1>2 判断类型结果是对还是错 如果是对就保存为真 不过是错就保存为假,那么如何表示真假呢 那有很多方法 可以用yes和no 也可以用计算机0或1表示
除了算数运算还有逻辑运算
逻辑运算三种:与、或、非
“!”(逻辑非)、“&&”(逻辑与)、“||”(逻辑或)是三种逻辑运算符。
“逻辑与”相当于生活中说的“并且”,就是两个条件都同时成立的情况下“逻辑与”的运算结果才为“真”。
逻辑与:只要有一个为假,那么结果一定为假
简单来讲就是 必须满足所有条件 才能执行
“逻辑或”相当于生活中的“或者”,当两个条件中有任一个条件满足,“逻辑或”的运算结果就为“真”
逻辑或:只要其中一个为真,那么结果就为真
或简单来说 就是满足其中一个条件 一个条件就可以执行
逻辑非:取反
!真1=假0 取它的反向数值 如果是正确使用非以后就是错的
编译型语言,没有额外的处理逻辑,所以都是强类型
脚本型语言 可有有解释器来控制,所以可以是弱类型
Shell:弱类型编程语言
强类型:变量在使用前,必须要实现声明,甚至还需要初始化 一般初始化为0
0不是空
真正的空表示为null:什么都没有
变量在存数据之前,必须先告诉程序,我有变量要用,这个变量是什么类型的
弱类型:变量直接用不需要声明 变量用时声明,甚至不区分类型
变量赋值:变量名=赋予的值 赋予的值会保存在这个变量名称所对应的存储空间里
知识串讲
Linux内置环境变量,这样可以简化命令使用,要不然外置命令全部都以全路径操作会非常麻烦
(1)变量:变量其实就是内存,而且是进程的变量 命名的内存空间。我在内存划出一部分空间然后命名,我就可以向起名的内存空间放数据,放数据的过程就变量赋值
Name=jay 在内存中找一部分空间起名叫name而空间中放的数据叫jay =就叫赋值,相当于一个抽屉 抽屉名字叫name 抽屉里的书叫jay
命令行中启动的脚本会继承当前shell中的环境变量
系统自行执行的脚本
$:引用变量${变量名} 花括号可以省略 但是如果造成名称混淆的那么必须加花括号
例 name=s
Echo‘你 是 大 傻 $”nameb”
这样就必须加 {} 花括号 因为系统会把nameb当成一个 变量名 所以${name}b就可以显示出来了
在复习一个知识点
‘’: 强引用 不做变量替换的 echo输出什么就是什么
“”:弱引用 内部的变量会替换
特殊变量
$?:保存上一个命令的执行状态返回值
程序执行以后可能有两类返回值
1 程序执行结果
2 程序执行状态返回代码(0-255)
0表示正确执行
1-255 表示错误执行 1、2、127系统预留
可有这么使用 ls /var
然后$?
如果现实0那么表示执行正确 其余1-255都表示错误
/dev/null 软件设备 又称数据黑洞 输入的任何数值都会被吞下去并且再也找不回来,类似于一个垃圾站, 如果把数据 用>> >追加在里头那么数据就会直接消失 以后会用到
set :查看当前shell中的变量
env:查看当前shell中的环境变量
export也可以
每天都在说 脚本 脚本的 那么什么是脚本?
脚本:其实就是程序的源代码,命令的堆砌,按实际需求,结合命令流程控制机制,实现的源程序
Bash如何实现条件测试判断?
条件测试类型:
整数测试:2是不是等于3
字符串测试:某一段所保存的数字 是不是a b c d
文件测试:判断文件是不是存在
条件测试的表达式,如何定义条件测试
[ 表达式 ]
注意: 表达式两边必须有空格 否则就是语法错误
[[ 表达式 ]]
test 表达式
格式 if [ 表达式1 –eq 表达式2 ]
整数比较:
-eq 等于 equal 一口:测试两个整数是否相等 比如 [ $a –eq $b ] 相等为真 不等为
假
-ne 不等于 no equal no 一口:测试两个整数是否不等 不等为真 相等为假
-gt 大于 greater than 格瑞特 赞 :测试一个数是否大于另一个数 大于为真 否则为假 有可能是小于或者等于
-lt 小于 less than 兰斯 赞 : 测试一数是否小于另一个数 小于为真 否则为假
-ge 大于或等于
-le 小于或等于
文件表达式
-e:测试文件是否存在,如果存在则为真
-d 目录:后面跟目录路径 测试是否是目录,则为真
-f 文件: 后面跟上文件路径 测试文件是否为普通文件
-r :测试指定文件,对当前用户来讲 执行脚本的用户 测试当前用户对指定文件是否有写权限
-x:测试指定文件,对当前用户来讲 执行脚本的用户 测试当前用户对指定文件是否有执行权限
-w:测试指定文件,对当前用户来讲 执行脚本的用户 测试当前用户对指定文件是否有写权限
逻辑与:&&
第一个条件为假 ,第二个条件就不用判断 ,结果就是为假
如果第一个条件为真,第二个条件必须要判断
相当于并联电路 只要有一个开关坏了 那么整体灯就不亮,所以就不必再去判断第二个开关是否为好
逻辑或:||
无论第一个条件为真或者为假,都会去判断第二个条件 两个都为假结果就为假
相当于串联 第一个坏不影响电路,所以第一为假 还是会去判断第二个条件,如果两个都为假,那么结果才为假
逻辑非 !
取反
如果逻辑与第一个条件为假 不存在 那么就不会去判断第二个条件了 ,所以在条件前头加上逻辑非 取反 让第一个条件假装为真,为真逻辑与才回去判断第二个条件
例如果用户不存在 那么就添加用户
! id –a wuxiaolei && userada wuxiaolei
第一个条件 id –a 查询没有wuxiaol这个用户 那么逻辑与就不会去判断第二个条件了,所以前头加逻辑非! 让第一个条件假装为真,第一个条件为真了那么逻辑与才回去判断第二个条件
变量名称命名规则:只能包含字母、数字和下划线,并且不能以数字为开头命名,不应该以系统现有的变量重名,不要习惯性的在变量后面加空格 例如w= wc-l 加空格是不允许的
条件判断控制结构
1. 单分支的if 语句
使用方法如下
if 条件判断 如果条件为真
then 则 执行下面的语句
执行 语句1
执行 语句2
……
fi
``:命令引用 这种引用的命令的执行结果,否则用得少命令的状态结果 就是0为真剩余为假的这种结果
双分支的if语句
If 指定判断条件 如果条件为真
then 则执行
执行语句1
执行语句2
…….
else 否则执行
执行语句 3
执行语句4
……..
fi
判断条件可以说整数比较,也可以某个状态返回值
多分支if语句
if 判断条件1 如果条件为真满足
则 then
执行 语句1
语句2
如果条件为假 不满足 那么
elif 那么判断
then
语句3
语句4 如果满足就到此为止里 ,如果还不满足就继续往下判定
elfi 那么判断
语句5
语句6
else 否则执行
语句7
语句8
If 结束
Shell中如何进行算数运算
A=3
B=4
C=$[$A+$B]
echo $C
7
(2)变量生成的过程就是申请内存使用的过程
本地变量:变量名=赋予数值即可 作用域为整个bash进程都可以使用
局部变量 local 变量名=赋予数值 作用域为当前代码段有效
Bash:变量是进程的变量,一但进程结束那么变量就会消失
环境变量:作用域为当前shell进程以及子进程。其余的与本地变量差不多
export 变量名=赋予数值
脚本在执行时,会启动一个子shell进程
位置变量:$1 ,$2 , …….
命令的组成部分
命令 选项 参数 这种格式
选项:修正命令执行特性
参数:命令的作用对象
位置变量就可以代替参数 比如说 cat /etc/inittab /etc/passwd / /etc/123.txt
命令 参数
那么位置变量就可以代替参数
让我们来看看实例 写个脚本 命名为d.sh
#!/bin/bash
#
fi [ -d $1 $2]
echo “是目录”
else
echo “不是目录”
fi
执行后
./d.sh /etc/init.tab /etc/passwd
就会显示是否为目录
因为 $1 $2 分别代替了命令的参数选项
这种非常灵活
$1:此处代替了 /etc/init.tab
$2:此处代替了 /etc/passwd
特殊变量
$?:执行命令状态返回值
$#: 利用echo 加$# 可以查看参数的个数
比如
./d.sh /etc/init.tab /etc/passwd
在脚本最上头加上
echo $#
那么执行完脚本
屏幕输出会出现2
就证明 有2个参数