脚本的初步了解笔记

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个参数

 

posted on 2018-03-21 16:06  村头修电脑  阅读(135)  评论(0编辑  收藏  举报