egrep及扩展的正则表达式:

egrep = grep -E

扩展正则表达式的元字符:

或者:a | b

练习:

1、显示当前系统root、centos或user1用户的默认shell和UID;

2、找出/et/rc.d/init.d/functions文件中某单词后面跟一个小括号的行;

3、使用echo输出一个路径,使用egrep取出基名;(整个路径的最后一个名称)

4、找出ifconfig命令结果中1-255之间的数值;

5、找出ifconfig命令结果中的IP地址;

注意:在使用或的时候会有很多坑,一定要小心,拿这题举例:

【1】匹配1-255之间的数字。

错:  # 由于或的存在,锚定词首只对第一个有效,锚定词尾只对最后一个选择有效。

对:  # 在一个符号多次出现的时候,没必要一个一个加,只要在外面加括号就可以了。

【2】匹配1-255数字加一个点。

(

【3】匹配IP地址

错:(

对:(

fgrep:不支持正则表达式搜索;

bash的基础特性(4)

变量类型:

数据存储格式 、存储空间大小、参与运算各类;

字符型

数值型 :

整型

浮点型

强类型:定义变量时必须指定类型、参与运算必须符合类型要求

弱类型:无须指定类型,默认均为字符型;参与运算会自动进行隐式类型转换;

bash中的变量的种类:

根据变量的生效范围等标准:

本地变量:生效范围为当前shell进程;对当前shell之外的其它shell进程,包括当前shell的子shell进程均无效;

环境变量:生效范围为当前shell进程及其子进程;

局部变量:生效范围为当前shell进程中某代码片断(通常指函数);

位置变量:$1, $2, ...来表示,用于让脚本在脚本代码 中调用通过命令行传递给它的参数;

特殊变量:$?, $0, $*, $@, $#

本地变量:

变量赋值:name="value"

可以使用引用:

value:

(1) 可以是直接字串:name="username"  注:变量赋值的=号前号不能有空格,不然shell会把变量名当命令执行,然后报command not found这个错误,这个和Python不太一样。另外VALUE值中如果没空格,引号也可以不用加。

(2) 变量引用:name="$username"

(3) 命令引用:name=`COMMAND`,name=$(COMMAND)   就是将一个命令的执行结果赋值给一个变量,推荐第2种方法。

变量引用:${name}, $name

" ":弱引用,其中的变量引用会被替换为变量值;

‘ ’:强引用,其中的变量引用不会被替换为变量值,而保持原来字符串;

显示已定义的所有变量

set

销毁变量:

unset name  注:变量名前不用加$

环境变量:

变量声明、赋值;

export name=VALUE

declare -x name=VALUE

示例:(1) 直接定义一个环境变量:

declare -x num1=3

(2) 将 一个本地变量导出为环境变量:

num2=5

declare -x num2

变量引用:$name,$(name)

显示所有环境变量:

export

env

printenv

销毁:

unset name

bash有许多内建的环境变量:PATH,SHELL,UID,HISISIZE,HOME,PWD,OLD,HISFILE,PS1

变量命令法则:

1、不能使用程序中的保留字;

2、只能使用数字、字母及下划线,且不能以数字开头;

3、见名识义;

只读变量:不能变改值,不能被销毁,只能等到shell进程终止时随之销亡。

readonly name

declare -r name

位置变量:

在脚本代码中调用通过命令行传递给脚本的参数;

$1,$2,....;对应调用第1、第2个参数

$0:命令本身;

$*:传递给脚本的所有参数;调用时将传递给脚本的所有参数当一个字符串;

$@:传递给脚本的所有参数;将传递给脚本的每一个参数当一个独立的字符串;

$#:传递给脚本的参数的个数;

示例:

[root@localhost bin]# ./posvar.sh tom jerry obama

./posvar.sh

jerry

$*:tom jerry obama

$@:tom jerry obama

$#:3

轮岗操作:shitf +[n]

[root@localhost bin]# nano posvar.sh

#!/bin/bash

echo $1shift 注:踢掉一个。

echo $1shift2注:踢掉两个

echo $1echo"$*:$*"echo"$@:$@"echo"$#:$#"

----------------------------------------------------------------[root@localhost bin]# ./posvar.sh tom jerry obama blair

tom

jerry

blair

$*:blair

$@:blair

$#:1

bash的配置文件:

按生效范围划分,存在两类:

全局配置:

/etc/profile

/etc/profile.d/*.sh

/etc/bashrc

个人配置:

~/.bash_profile

~/.bashrc

按功能划分,存在两类:

profile类:为交互式登录的shell提供配置;

全局:/etc/profile,/etc/profile.d/*.sh

个人:~/.bash_profile

功用:

(1)用于定义环境变量;

(2)运行命令或脚本;

bashrc类:为非交互式登录的shell提供配置;

全局:/etc/bashrc

个人:~/.bashrc

功用:

(1)定义命令别名;

(2)定义本地变量;

shell登录:

交互式登录:

直接通过终端输入账号密码登录;

使用:su -UserName 或su -l UserName 切换的用户

/etc/profile --> /etc/profile.d/*.sh --> ~/.bash_profile --> ~/.bashrc --> /etc/bashrc

非交互式登录:

su UserName

图形界面下打开的终端

执行脚本

~/.bashrc --> /etc/bashrc --> /etc/profile.d/*.sh

编辑配置文件定义的新配置的生效方式:

(1)重新启动shell进程;

(2) 使用source或.命令进程;

问题:

1、定义对所有用户都生效的别名?

2、让用户的PATH环境变量的值多出一个路径,例如多加/usr/local/apache2/bin

bash中的算术运算:

+,-,*,/,%,**

实现算术运算:

(1)let var=算术表达式

(2)var=$[算术表达式]

(3)var=$((算术表达式))

(4)var=$(expr arg1 arg2 arg3 ....)  例如:mul2=$(expr $num1 * $num2)

乘法符号有些场景中需要转义;

bash有内建的随机数生成器:$RANDOM  例如:echo $[$RANDOM%60+1]

增强型赋值:

+=,-=,*=,/=,%=

let varOPERvalue

例如:let count+=1

自增,自减:

let var+=1

let var++

let var-=1

let var--

练习1:写一个脚本

计算/etc/passwd文件中的第10个用户和第20用户之ID之和;

练习2:写一个脚本

传递两个文件路径作为参数给脚本,计算这两个文件中所有空白行之和;

条件测试:

判断某需求是否满足,需要由测试机制来实现;

Note:专用的测试表达式需要由测试命令辅助完成测试过程;

测试命令:

test EXPRESSION

[ EXPRESSION ]

[[ EXPRESSION ]]

Note:EXPRESS前后必须有空白字符,写的时候容易忘记,提示命令不存在;

bash的测试类型:

数值测试:

-gt:不否大于;

-ge:是否大于等于;

-eq:是否等于;

字符串测试:

==:是否等于;

>:是否大于;

!=:是否不等于;

~=:左侧字符串是否能够被右侧的PATTERN所匹配;

Note:此表达式一般用于[[   ]]中;

-z "STRING”:测试字符串是否为空,空则为真,不空则为假;

-n "STRING":测试字符是否不空,不空则为真,空则为假;

Note:用于字符串比较时用到的操作数都应该使用引号;

文件测试

bash自定义退出状态码

exit [n]:自定义退出状态码;

注意:脚本中一旦遇到exit命令,脚本会立即终止;终止退出状态取决于exit命令后面的数字;

注意:如果未给脚本指定退出状态码,整个脚本的退出状态码取决于脚本中执行的最后一条命令的状态码;

练习:写一个脚本

接受一个文件路径作为参数;

如果参数个数小于1,则提示用户“至少应该给一个参数”,并立即退出;

如果参数个数不小于1,则显示第一个参数所指向的文件中的空白行数;