01 shell脚本调试方法
1 调试脚本选项
-n——读一遍脚本中的命令但不执行,用于检查脚本中的语法错误
-v——一边执行脚本,一边将执行过的脚本命令打印到标准错误输出
-x——提供跟踪执行信息,将执行的每一条命令和结果依次打印出来
这些选项有三种常见用法:
(1)在命令行提供参数,如:
$ sh -x ./script.sh
(2)在脚本开头提供参数,如:
#! /bin/sh -x
(3)在脚本中用set命令启用或者禁用参数,如:
#! /bin/sh
if [ -z "$1" ]; then
set -x <<==启用参数
echo "error"
exit 1
set +x <<==禁用参数
fi
02 正则表达式
2 字符类
. ——匹配任意一个字符,如cod.可以匹配cod1、code等
[] ——匹配括号中的任意一个字符,如[abc]d可以匹配ad、bd、cd等
- ——在[]内表示字符范围(仅在中括号内有效),如[a-z]表示所有的小写字母
^ ——位于[]括号内的开头,匹配除括号中的字符之外的任意一个字符,
3 数量限定符
? ——紧跟在它前面的单元匹配0次或1次,=0或=1
+ ——紧跟在它前面的单元匹配1次或多次,>=1
* ——紧跟在它前面的单元匹配0次或多次,>=0
{N} ——精确匹配N次,=N
{N,} ——至少匹配N次,>=N
{,M} ——最多匹配M次,<=M
{N,M} ——匹配次数介于M-N之间,>M并切<N
4 位置限定符
^ ——匹配行首的位置,匹配内容位置限定为行首
$ ——匹配行末的位置,匹配内容位置限定为行末尾
\< ——匹配单词开头的位置
\> ——匹配单词结尾的位置
\b ——匹配单词开头或结尾的位置,如\bat\b表示匹配at,其他单词均无法匹配
\B ——匹配非单词开头或结尾的位置
例如,匹配IP地址的正则表达式为
egrep '[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}' test.regex
或
egrep '^([0-9]{1,3}\.){3}[0-9]{1,3}$' filename
5 Basic正则和Extended正则
Basic正则——基础正则,字符?+{}|()等符号使用时均需要增加转义字符\,使用指令grep执行
Extended正则——扩展正则,使用执行egrep,egrep指令某系系统不支持,需要切换为grep -E 来执行
如:匹配IP地址的正则表达用扩展正则的写法是:
egrep '^([0-9]{1,3}\.){3}[0-9]{1,3}$' filename
用基础正则的写法是:
grep -E '^([0-9]{1,3}\.){3}[0-9]{1,3}$' filename
或
grep '^\([0-9]\{1,3\}\.\)\{3\}[0-9]\{1,3\}$' filename # 含有大量转移符,不易读
6 综合实例
(1)使用vi新建测试文档test.regex,在文档中输入随机的字符组合,如下所示:
10.44.53.130
test
aa
bb
art
test
start
end
E2
R4
A1
B1
c1
d1
y1
.5
2.3
4.5
0.5
ee.yy.tte.cc
192.168.1.108
55g.445.45.64
huawei
tencent
dji
(2)在命令行调用egrep指令,搜索IP地址:
$ egrep '^([0-9]{1,3}\.){3}[0-9]{1,3}$' test.regex
10.44.53.130
192.168.1.108