grep:支持基本正则表达式,使用?、{}、()等元字符必须使用\转义
egrep:支持扩展正则表达式,多支持+、|等元字符,且无需转义
fgrep:fast grep,不支持正则表达式,效率最高,消耗资源最少。
shell的编程特性:脚本编程
先看看编程语言的分类:
按语言等级层次分:
机器语言-->汇编语言-->高级语言
按语言特性分类:
编译型(静态)语言:执行前必须先编译成可执行格式,执行时无需其他条件
强类型(变量):变量在使用前必须先声明,甚至还需初始化
c、c++、c#、java ...
解释型(动态)语言:边解释边执行,要想执行,系统中必须包含对应的解释器
弱类型:变量用时声明,甚至不区分类型
php、python、perl、shell ...
按工作特性分类:
面向过程语言:c、shell、perl
面向对象语言:java、python、c++、perl
变量:一段公用的内存空间
内存:编址的存储单元
进程:执行中的程序
变量类型:事先确定数据的存储格式和长度
字符型:
数值:
整形
浮点型:11.23 1.123*10^1 0.123*10^2
时间:
2015.12.30:64bit
99999:24bit
linux默认把数据存储为字符格式,以下命令不会得到想要的结果
[root@logstach tmp]# echo 2+3
2+3
可以这样:(注意2+3之间要空格)
[root@logstach tmp]# expr 2 + 3
5
问题:为什么要定义变量类型?
假设我们存储10这个代码,如果我们把它存储成字符类型,那么理论上7个二进制位可以完全表示ascll码,存储10则需要14位,但是由于计算机最小单位是字节,所以最终占用16位。而如果存储为数字格式的话,10转化为二进制为1010,也就是只要4位最终占用1个字节就可以了。如果不加以区分,会早造成大量的空间浪费。
缓冲区溢出攻击:
假设我们定义一个变量的存储长度为8bit,当存储数值为256时,此时数值超过了8bit能表示的数值,于是向前进1,这个1就是溢出的位,如果溢出的位影响到的地址空间恰好是某个关键性进程的内存空间,所造成的后果是难以想象的。
逻辑运算:与、或、非、异或
变量赋值:VAL_NAME=VALUE
bash变量:
本地变量:VALNAME=VALUE 作用域为整个bash进程
局部变量:local VALNAME=VALUE 作用域为当前代码段
环境变量:export VALNAME=VALUE 或VALNAME=VALUE ; export VALNAME
作用域为当前shell进程以及子进程
特殊变量:$?上一个命令的执行状态返回值
位置变量:1、2、....
脚本在执行时会启动一个子shell进程
命令行中启动的脚本会继承当前shell的环境变量
非命令行(系统自动执行的脚本)需要自我定义各环境变量;
程序执行时,可能有两类返回值:
程序执行结果
程序状态返回代码(0-255)
0:正确执行
1-255:错误执行,1,2,127系统预留
/dev/null:软件设备,bit bucket,数据黑洞,任何输出指向给它都不再屏幕上显示也不存储
引用变量:${VALNAME} {}有时可以省略
不可以省略的情况:
[root@logstach ~]# name=you
[root@logstach ~]# echo "i am $namer lover"
i am lover
[root@logstach ~]# echo "i am ${name}r lover"
i am your lover
撤销变量:
unset VARNAME
查看当前shell中变量:
set
查看当前shell中的环境变量:
printenv
env
export
脚本:命令的堆砌,按实际需要,结合命令流程控制机制实现的源程序
shebang:魔数
#!/bin/bash
linux只认为elf是可执行格式,魔数的作用就是告诉内核用什么解释器来解释执行这些ascll代码,如果perl脚本就用#!/bin/perl,python脚本就用#!/bin/python
练习:写一个脚本,完成以下任务
1,添加5个用户,user1...user5
2.每个用户密码通用户名,而且要求添加密码不显示passwd返回的执行结果信息。
3.每个用户添加完成后,显示xxx添加成功字样。
练习:写一个脚本,完成以下任务
-
使用一个变量保存一个用户名
-
删除此变量中的用户,并删除其家目录
-
显示用户删除完成信息。
本文转自biao007h51CTO博客,原文链接:http://blog.51cto.com/linzb/1730424 ,如需转载请自行联系原作者