《shell之bash编程》由会员分享,可在线阅读,更多相关《shell之bash编程(18页珍藏版)》请在金锄头文库上搜索。
1、shell编程:编译器,解释器编程语言:机器语言(0,1,代码),汇编语言,高级语言(接近人类思维的语言,) 高级语言: 静态语言:编译型语言,自由开发环境,写完代码后,通过编译器。强类型(变量)关键字:C/C+/JAVA/C# 解释器一般都是静态语言开发的事先转换成可执行格式 动态语言:解释型语言,写完代码后,需要执行的进行转换,解释器。 弱类型() 边解释边执行,解释一条,执行一条。 PHP/SHELL/python(最新很流行)/perl面向过程:把编程的着眼点立足在主要问题解决本身。(小型)Linux是用C语言研发的。Shell,面向对象:把要完成的对象抽象成一个个的项目,并且定义对象
2、之间的动作。(大型应用程序),Java,python,perl,c+ 没有一个语言可以解决所有问题 变量:内存空间,命名的内存空间,用完空间可以回收 内容:是编址的存储单元 进程: 数值10:1010(4=8bit), 字符10:16bit,1个字符8位。变量类型:事先确定数据的存储格式和长度 例:定义整型,给8bit,输入256,就会(缓存区)溢出,会覆盖其他进程。入侵系统 字符:数值 整型 浮点型:11.23,小数点之前的作为一个单位存放,小数点之后的作为一个单位存放,存储下小数点的位置。 1123* 101 0.1123*102 2013/10/10,从1970年至今多少天再转换就行了。
3、 存储字符和数值,格式不同,机制不同,所占内存不同。 存储24和24.00,值一样但是所占内存不同布尔型:逻辑,1+12,真假 逻辑运算:与、或、非、异或 (整个计算机的内部就靠这些联络起来的) 与:1 & 0 = 0 0 & 1 = 0 0 & 0 = 0 1 & 1 = 1 只有真真相遇为真 串联电路,2个开关必须都开,等会亮 或:1 & 0 = 1 0 & 1 = 1 0 & 0 = 0 1 & 1 = 1 只要一个真则真 并联电路,只要1个开关打开,灯就会亮 非:单目,!真(对真取反)=假 !假(对假取反)=真 对真取假,对假取真 非门,电磁感应,对应常开或常段 异或:0 & 0 =
4、0 1 & 1 = 0 1 & 0 =1 0 & 1 =1 操作数相同为假,不同为真 数字逻辑和电逻辑的重合之处, 短路逻辑运算: 与:只要有一个为假,结果一定为假 或:只要有一个为真,结果一定为真 Shell是弱类型编程语言 强类型:变量在使用前,必须事先声明,甚至还需要初始(空:NULL,不是0)。 数值为0,字符为空 弱类型:变量用时声明,随用随声明,甚至不区分类型(一般默认为字符串), 11+C =隐含了内部转换,即隐式转换 指定转换格式等,是显示转换。 变量赋值: VAR_NAME=VALUE Bash变量类型: 环境变量 本地变量(局部变量,不全时本地变量) 位置变量 特殊变量(也
5、称系统变量)本地变量:只对整个bash进程有效。如bash,bash运行起来后,可以在它里面声明变量,随时声明随时用,bash进程关闭后,变量也就没了,变量是进程的变量。 rootlocalhost /# NAME=jerry (变量是NAME,内容是jerry)rootlocalhost /# echo $NAMEjerry 一个进程和一个进程无关联性, rootlocalhost /# bash 进入子shellrootlocalhost /# echo $NAME 查看子shell中有无变量 无变量rootlocalhost /#引用变量:rootlocalhost # echo The
6、re are some $ABCs. /花括号内的是变量There are some pigs.以上“”双引号是弱引用,作变量替换。rootlocalhost # echo There are some $ABCs.There are some $ABCs.以上单引号是强引用,不作变量替换。(原样输出)局部变量: (作用域:只对当前代码段有效)local VARNAME=VALUE环境变量: (作用域:当前shell进程及其子进程)export VARNAME=VALUE脚本在执行时会启动一个子shell进程命令行中启动的脚本会继承当前shell环境变量;系统自动执行的脚本(非命令行启动)就需
7、要自我定义需要各环境变量。rootlocalhost # ABC=pigrootlocalhost # export ABCrootlocalhost # echo $ABCpigrootlocalhost # bashrootlocalhost # echo $ABCpig位置变量:脚本参数 $,1$2特殊变量:$?:上一个命令的执行状态返回值rootlocalhost # echo $ABCpigrootlocalhost # echo $? /0代表真,执行正确。0程序执行,可能有两类返回值: 程序执行结果: 程序状态返回代码(0-255)输出重定向:22&dev/null :软件模拟的
8、设备,bit bucket 数据黑洞rootlocalhost # ls /etc/ & /dev/nullrootlocalhost # echo $?0设置变量:set 默认可以省略 撤销变量:unset VARNAME 不加变量值,因为我们要撤销变量,不是变量值。变量查看:查看当前shell变量 所有变量 set 不带任何选项、参数 (包括环境变量和本地变量) 查看当前shell中环境变量envexport 特殊变量和位置变量没办法查看脚本:命令的堆砌,按照实际需要,结合命令流程控制机制实现的源程序shebang:指定程序的模数,脚本首行必须加 #!/bin/bash步骤:1. 写脚本
9、nano name.sh 首行加:#!/bin/bash2. 加权限 (不加权限也可以手动执行:rootlocalhost jb# bash first.sh )一般加权限:rootlocalhost jb# chmod +x first.sh3. 找路径 (pwd)4. 执行 a) ./加文件rootlocalhost jb# ./first.shb) sh 加文件(start)rootlocalhost jb# sh first.shc) 练习:写一个脚本,完成以下任务。1. 添加5个用户,user1 user22. 每个用户的密码同用户名,而且要求,添加密码完成后不显示passwd命令的
10、执行结果;#!/bin/bashuseradd user1echo user1 | passwd -stdin user1 | &/dev/nulluseradd user2echo user2 | passwd -stdin user2 | &/dev/nulluseradd user3echo user3 | passwd -stdin user3 | &/dev/nulluseradd user4echo user4 | passwd -stdin user4 | &/dev/nulluseradd user5echo user5 | passwd -stdin user5 | &/de
11、v/null练习:写一个脚本,完成以下任务。1. 使用一个变量保存一个用户名2. 删除此变量中的用户,且一并删除其家目录;3. 显示“用户删除完成”类信息;条件判断: 如果用户不存在添加用户,给密码并显示添加成功 否则显示如果已存在,不添加。bash 中如何实现条件判断? 条件判断类型: 整数测试: 字符测试: 文件测试: 条件测试的表达式:(expression表达式两端必须有空格,否则是语法错误。) expression :命令测试 expression :关键字测试test expression :a) 整数比较-eq:测试两个整数是否相等,相等为真,不等为假。-ne:测试两个整数是否不
12、等,不等为真,相等为假。-gt:测试一个数是否大于另一个数,大于为真,否则为假。-lt:测试一个数是否小于另一个数,小于为真,否则为假。-ge: 测试一个数大于或等于另一个数,大于等于为真,否则为假。-le:测试一个数小于或等于另一个数,小于等于为真,否则为假。rootlocalhost jb# ./init.shnot big file rootlocalhost jb# ./init.shnot big file命令间的逻辑关系: 逻辑与:&逻辑或:|如果用户存在,就显示用户已存在,否则,就添加此用户。如果用户不存在,就添加此用户,否则,显示已存在。如果用户不存在,添加并给密码,否则,显示
13、已存在。检查一个用户是否是管理,是显示为管理员,否则显示为普通用户。b) 字符比较c) 文件 变量名称:1. 只能包好字母、数字和下划线,并且不能数字开头;2. 不应该跟系统中已有的环境变量重名;3. 最好做到见名知义。关键字: if条件判断,控制结构:1) 单分支判断语句:if 判断条件;then 单分支:如果怎样,就如何如何statemen1statemen2fi2) 双分支判断语句 双分支:如果怎样,就怎样,否则就怎样 规划if 判断条件;thenstatemen1statemen2elsestatemen1fi检查一个用户是否是管理,是显示为管理员,否则显示为普通用户。练习: 判断当前系统上是