shell编程php
编程语言:机器语言 、汇编语言、高级语言java
高级语言python
静态语言:编译型语言c++
不须要借助额外的二进制程序,能够直接写代码shell
属于强类型的语言(变量)编程
事先转换成可执行格式,不须要解释器,本身就能够完成程序c#
属于静态语言的: C C++ java c#bash
问题就是容易出bug,由于是所有完成之后执行,没有校对,一旦出问题很难排查less
动态语言:解释型语言编程语言
弱类型的语言:
不须要直接转换有编译器 ,边解释边执行
Asp php shell python perl
Bash:脚本解释器
面向过程:就是分析出解决问题所须要的步骤,而后用函数把这些步骤一步一步实现,使用的时候一个一个依次调用就能够了。
面向对象:是把构成问题事务分解成各个对象,创建对象的目的不是为了完成一个步骤,而是为了描叙某个事物在整个解决问题的步骤中的行为。适合开发大型应用程序
例如五子棋,面向过程的设计思路就是首先分析问题的步骤:一、开始游戏,二、黑子先走,三、绘制画面,四、判断输赢,五、轮到白子,六、绘制画面,七、判断输赢,八、返回步骤2,九、输出最后结果。把上面每一个步骤用分别的函数来实现,问题就解决了。
而面向对象的设计则是从另外的思路来解决问题。整个五子棋能够分为 一、黑白双方,这两方的行为是如出一辙的,二、棋盘系统,负责绘制画面,三、规则系统,负责断定诸如犯规、输赢等。第一类对象(玩家对象)负责接受用户输入,并告知第二类对象(棋盘对象)棋子布局的变化,棋盘对象接收到了棋子的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 表示错误执行 一、二、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个参数