编译器、解释器
编程语言分为:机器语言(010101 代码)、汇编语言、高级语言(比较接近于人类的思考方 式,也接近于机器的运行特性,需要编译器或者解释器转换成机器语言)
高级语言基本可以分为两类:
静态语言:编译型语言,一般都是强类型的语言
需要实现编译,实现转换成可执行格式
属于静态语言的:C,C++,Java,C#等
动态语言:解释型语言,一般都是弱类型的语言
边解释边执行(如:解释器解释一条语句执行一条语句)
如:ASP,PHP,shell,python,perl等等
shell为解释型语言,也就是说运行bash的脚本时,系统中要有bash的解释器,解释器本身通常都是由静态语言开发的。
面向过程:着眼点在问题解决过程的本身动作,shell脚本,C语言都是面向过程的
面向对象:将问题抽象为一个对象,Java,python为纯面向对象的
要想理解编程,就必须得理解变量,变量就是内存空间
变量:指向一段内存空间,对内存空间得一个命名
内存为编址得存储单元,都有唯一得地址指向某个存储单元
如存储一个字符串的“10”和一个整数“10”的区别:
字符串“10”:需要 16bit 存储空间 整数 10:需要 8bit (8 位二进制保存的范围 0-255 ,2^8)
所以变量需要有类型:
变量类型:实现确定数据的存储格式和存储长度,如字符,整数。。。。。。
字符:
数值:
整型
浮点型
Bool 型:真、假
脚本语言,有解释器得语言,变量都是弱类型得,都有解释器提供保护机制,来规范变量类型。
运算除了算术运算,还有逻辑运算:
逻辑运算:与,或,非,异或
异或:两个操作数相同为假,否则为真
Shell:弱类型编程语言
强类型语言:变量在使用前,必须事先声明,甚至还需要初始化
弱类型语言:变量用时声明,就是拿来直接使用即可,不区分类型
变量赋值:VAR_NAME=VALUE
对于bash shell变量类型:
环境变量:作用域为当前shell进程及其子进程(子shell)
定义环境变量:export VARNAME=VALUE(也称为导出一个变量)
环境变量例子:
此时,如果重新登陆一个shell,则读取不到,因为重新登陆shell与当前shell已经没有任何联系了。
脚本在执行时会启动一个子shell进程:
命令行启动得脚本会继承当前得shell环境:
系统自动执行得脚本(非命令行启动),需要定义需要得各环境变量:(如:crontab中的脚本经常出现某种问题)
本地变量:声明本地变量 VARNAME=VALUE,作用范围为整个脚本
局部变量:针对函数而言,声明局部变量:local VARNAME=VALUE,作用范围为当前的代码段
位置变量:$1,$2,......用来引用脚本的参数的
特殊变量:bash内置的,用来保存某些特殊数据的变量
$?:上一个命令执行状态返回值
程序执行,可能有两类返回值:
程序执行结果
程序状态返回代码(0-255)
0:正确执行
1-255: 错误执行,1,2,127 为系统预留
引用变量:${VARNAME},{}可以省略,在父shell声明的变量不能被子shell使用
必须得使用{}的情况:
有时候在命令输入执行后,程序执行结果不需要,只要状态返回码,这时需要将程序执行结果重定向
输出重定向:
>:覆盖重定向
>>:追加重定向
2>:错误重定向 2
>>:错误之家重定向
&>:同时重定向
一个经常用到的重定向特殊位置:/dev/null
撤销变量:
定义变量的时候使用set,一般情况下都省略了。Unset撤销变量
unset VARNAME
注:变量名不加$,export 的时候变量名也不加$
查看当前 shell 中的变量:包括环境变量和本地变量
查看当前 shell 的环境变量:
Printenv
Env
Export
变量的追加:
为 PATH 环境变量补上一个新的执行路径:
对于shell来讲,所有的变量默认都是字符串,所以默认情况下是不能做算术运算的
脚本:通常情况下为命令的堆砌,按照实际需要结合命令流程控制机制实现源程序
(file 查看是否为可执行程序,ELF为linux内核可以直接运行的程序)
Shebang:制定程序的模数
练习: 1、添加 5 个用户,user1,user2...user5 2、每个用户的密码同用户名,而且要求,添加密码完成后不显示命令执行的结果信息 3、每个用户添加完成后都要显示”用户 xxx 已经成功添加“;若用户此前已经存在则也要提 示出来,并且不执行添加动作
练习:写一个脚本,完成以下任务: 1、使用一个变量保存一个用户名 2、删除此变量中的用户且一并删除其家目录 3、显示”用户删除完成“类的提示信息
从根本上讲,上边的两个联系不能称为脚本,只是命令的简单堆砌
条件判断:
Bash 如何实现条件判断:
条件测试类型:
整数测试:2是否等于3
字符串测试:变量中的字符串是否为“abcd”
文件测试:文件是否存在
条件测试的表达式,常用的三种
[expression]
[[expression]](两个中括号是bash的关键字)
test expression
整数比较:
-eq:测试两个整数是否相等:$A -eq $B
-
-ne:测试两个整数是否不相等;$A -ne $B,不相等为真,相等为假
-gt:测试一个数是否大于另外一个数;$A -gt $B
-lt:测试一个数是否小于另一个数
le:小于或者等于
Bash shell 中命令的逻辑关系:
逻辑与:&& 第一个条件为假时,第二个条件不会再判断,最终结果已经确定。若第一个条件为真,则第二个条件必须再判断,最后才会确定最终的判断。
逻辑或:|| 如果第一个条件为假,那么就执行第二个条件的命令
变量名:
1.只能包含字母,数字和下划线,并且不能数字开头
2.不应该跟系统中已有的环境变量重名
3.最好做到见名义