正则表达式续:
BasicREGEXP:基本
ExtendedREGEXP:扩展
基本正则表达式:
字符
.: 匹配除\n以外的任何字符
[]:匹配指定范围内的任意单个字符
[^]:匹配指定范围外的任意单个字符
次数匹配:
*:
\?: 0或1次
\{m,n\}:至少m次,至多n次;
.*:任意长度的任意字符
锚定:
^:行首
$:行尾
\<, \b:
\>, \b:
\(\)
\1, \2, \3, ...
grep:使用基本正则表达式定义的模式来过滤文本的命令;
-i忽略字符大小写
-v反向查找,显示没有被模式匹配到的行
-o只显示被模式匹配到的字符串
--color显示颜色
-E:使用扩展正则表达式
-A#: 前#行
-B#: 后#行
-C#: 前后各#行
扩展正则表达式:
字符匹配:
.
[]
[^]
次数匹配:
*:
?:
+: 匹配其前面的字符至少1次
{m,n}
位置锚定:
^
$
\<
\>
分组:
():分组
\1, \2, \3, ...
或者
|: or 整个左边和右边匹配单个可以分组
C|cat: Cat或cat, C或cat
grep -E = egrep
grep--color -E '(c|C)at' test6.txt
练习续
4、显示所有以数字结尾且文件名中不包含空白的文件;
ls [^[:space:]]\{0,\}[0-9]$
找出/boot/grub/grub.conf文件中1-255之间的数字;
\<([1-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\>
grep -e
\.
ifconfig |egrep'\<([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\>
\.
\<([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\>
\.
\<([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\>
\.
\<([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\>'
ifconfig | egrep--color'(\<([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\>\.){3}\<([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\>'
IPv4:
5类:A B C D E
A:1-127
B:128-191
C:192-223
\<([1-9]|[1-9][0-9]|1[0-9]{2}|2[01][0-9]|22[0-3])\>
(\.\<([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-4])\>){2}
\.
\<([1-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-4])\>
grep, egrep
fgrep: 不支持正则表达式 fast grep
shell编程:
编译器,解释器
编程语言:机器语言、汇编语言、高级语言
静态语言:编译型语言
强类型(变量)
事先转换成可执行格式
C、C++、JAVA、C#
动态语言:解释型语言, on the fly
弱类型
边解释边执行
PHP、SHELL、python、perl
面向过程:Shell, C
面向对象: JAVA, Python, perl, C++
变量:内存空间,命名
内存:编址的存储单元
进程:
1+100:
1+1000000
1
变量类型:事先确定数据的存储格式和长度
字符
数值
整型
浮点型: 11.23,1.123*10^1,0.1123*10^2
2013/10/10,64bit
99999:24bit,
真、假
逻辑:1+1>2
逻辑运算:与、或、非、异或
1: 真
0: 假
1 &0 = 0
0 & 1 = 0
0 & 0 = 0
1 & 1 = 1
或:
非:
! 真 = 假
! 假 = 真
shell: 弱类型编程语言
强:变量在使用前,必须事先声明,甚至还需要初始化;
弱:变量用时声明,甚至不区分类型;
变量赋值:VAR_NAME=VALUE
bash变量类型:
环境变量
本地变量(局部变量)
位置变量
特殊变量
本地变量:
set VARNAME=VALUE: 作用域为整个bash进程;
局部变量:
local VARNAME=VALUE:作用域为当前代码段;
环境变量:作用域为当前shell进程及其子进程;
export VARNAME=VALUE
VARNAME=VALUE
export VARNAME
“导出”
位置变量:
$1, $2, ...
特殊变量:
$?:上一个命令的执行状态返回值;
程序执行,可能有两类返回值:
程序执行结果
程序状态返回代码(0-255)
0:正确执行
1-255:错误执行,1,2,127系统预留;
id user1 有返回0
输出重定向:
>重定向
>>追加重定向
2>错误重定向
2>>错误追加重定向
&>错误加普通重定向
撤消变量:
unset VARNAME
查看当shell中变量:
set
查看当前shell中的环境变量:
printenv
env
export
脚本:命令的堆砌,按实际需要,结合命令流程控制机制实现的源程序 .sh结尾
ANIMALS=$ANIMALS:SHEEP追加值
#!/bin/bash
cat /etc/fstab
ls /var
shebang: 魔数
#!/bin/bash
# 注释行,不执行
/dev/null: 软件设备, bit bucket,数据黑洞
脚本在执行时会启动一个子shell进程;
命令行中启动的脚本会继承当前shell环境变量;
系统自动执行的脚本(非命令行启动)就需要自我定义需要各环境变量;
脚本练习:
写一个脚本,完成以下任务
1、 添加5个用户,user1,...,user5
2、每个用户的密码同用户名,而且要求,添加密码完成后不显示passwd命令的执行结果信息;
3、每个用户添加完成后,都要显示用户某某已经成功添加;
#!/bin/bash
#
usesadd user1
echo "user1" | passwd –stdinuser1 &> /dev/null
echo "Add user1 successfully."
usesadd user2
echo "user2" | passwd –stdinuser2 &> /dev/null
echo "Add user2 successfully."
usesadd user3;
echo "user3" | passwd –stdinuser3 &> /dev/null
echo "Add user3 successfully."
usesadd user4;
echo "user4" | passwd –stdinuser4&> /dev/null
echo "Add user4 successfully."
usesadd user5;
echo "user5" | passwd –stdinuser5 &> /dev/null
echo "Add user5 successfully."
脚本条件判断:
如果用户不存在
添加用户,给密码并显示添加成功;
否则
显示如果已经没在,没有添加;
bash中如何实现条件判断?
条件测试类型:
整数测试
字符测试
文件测试
条件测试的表达式:
[expression ]
[[expression ]]
testexpression