5天学会linx内核.docx
《5天学会linx内核.docx》由会员分享,可在线阅读,更多相关《5天学会linx内核.docx(37页珍藏版)》请在冰豆网上搜索。
5天学会linx内核
脚本编写技巧
脚本文件名命名规则
文件名的字符包括
字母、数字、"."、"_"和"-",注意:
脚本的文件名命名不能以数字开头。
脚本文件名的命名,尽量使用英文单词、词组或短句的缩写。
脚本版本管理:
脚本作用.主版本号.修改次数.shell类型
变量命名规范
变量名可以由数字和字母组成
变量名采用全部英文字符小写的方式
变量名称尽量使用缩写,最好不要超过6个字符
${变量名}例:
${port},${ipaddr}…
脚本代码注释规范
脚本代码注释可以使用"#"和";(分号)"两种方式进行注释。
#一般由于描述性的注释,旨在说明代码的作用或怎么使用。
而;通常用于示例性的注释,特别是在一些配置文件中常常会用到,因此我们沿用这两种方式来对我们的脚本进行注释。
引用符号使用规范
尽量少用单引号
对极个特殊字符进行屏蔽特殊含义时,使用\(反斜线)进行屏蔽
使用带引号进行屏蔽字符时,单引号内一般不适用其他引用符号,除非是打印特殊符号本身。
使用反引号进行执行一个shell命令时,反引号内一般加其他引用符号。
脚本函数定义规范
变量名可以由数字和字母组成
使用驼峰命名法(从第二个单词开始,每个单词首字母大写)
名字尽量不使用缩写,除非它是众所周知的
名字可以有两个或三个单词组成,但通常不应多于三个
文本输出排版
第一天课后作业
1、grep"20081011"text.txt取出这一天的数据
2、grep"200804"text.txt取出这一个月的数据
3、grep"200806"text.txt|grep-v"-"取出一个月的上涨数据
4、grep"200807"text.txt|grep-v"-"|wc-l列出有几天是上涨个数,带统计
5、grep"200808"text.txt|sort-k5-n|tail-1判断上涨,然后tail取最后一行
grep"200808"text.txt|sort-k5-r|head-1判断上涨,然后head取第一行
6、grep"200810"text.txt|awk'{if($4>0){print$1,$5}}'取出一月中上涨数据时间和上涨幅
7、grep"200811"text.txt|awk'{if($4>5&&$4<20){print$0}}'判断区间取出整行
脚本代码实例分析1
编写一个shell脚本,执行脚本后自动ping以下地址:
192.168.1.1,192.168.1.31
以上IP地址直接写在脚本之中。
执行完成后,
应显示能够ping通的IP地址和不能够ping通的IP地址
#!
/bin/bash
ifping192.168.1.1-c1
then
echo"192.168.1.1online"
else
echo"192.168.1.1offline"
fi
ifping192.168.1.31-c1
then
echo"192.168.1.31online"
else
echo"192.168.1.31offline"
fi
脚本代码实例分析2
修改分析1,但是从iplist.txt中读取IP
#!
/bin/bash
foripin`catiplist.txt`
do
ifping$ip-c1
then
echo"${ip}online"
else
echo"${ip}offline"
fi
done
脚本代码实例分析3
修改分析2,去除无用的信息
#!
/bin/bash
foripin`catiplist.txt`
do
ifping$ip-c1>/dev/null2>&1
then
echo"${ip}online"
else
echo"${ip}offline"
fi
done
脚本代码实例分析4
修改分析3,生成记录
#!
/bin/bash
>hoststatus.txt
foripin`catiplist.txt`
do
ifping$ip-c1>/dev/null2>&1
then
echo"${ip}online"|tee-ahoststatus.txt
else
echo"${ip}offline"|tee-ahoststatus.txt
fi
done
脚本代码实例分析5
产生一个IP地址池,生成255个IP,并修改分析4,实现多线程ping
#!
/bin/bash
>iplist
foripin`seq1255`
do
echo"192.168.1.${ip}">>iplist
done
#!
/bin/bash
>hoststatus.txt
>temp
fastping()
{
ifping${1}-c1>/dev/null2>&1
then
echo"${ip}online"|tee-atemp
else
echo"${ip}offline"|tee-atemp
fi
}
foripin`catiplist.txt`
do
fastping$ip&
done
wait
sort-t.-k4-ntemp>hoststatus.txt
rmtemp
temp./ping.sh测试一个脚本执行多久
以下是Shell学习1-2天学习笔记
————————-我是分隔符—————————
硬件去执行,内核与硬件之间进行操作。
命令解析器。
shell脚本的组成元素
1.系统命令
2.文本处理工具(sort、grep、sed、awk…)
3.变量
4.条件判断
5.环循结构
6.函数
ShellScriptsCenter(SSC)
———————————————————————————-
非负Grep/awk
几天。
统计Wc
Sort排序sort|head/sed
字段处理awk
数据区域判断awk|wc
显示文本:
echo[选项]文本
-n不要自动换行
-e解析转义符
a发出警告音
c最后不加上换行符号
f换行
r回车
彩色文本
Echo–e“33[40;35m….]”
echo“Hello,world”
echo–e“33[40;35mHell,world33[0m"
sort[选项]输入文件
-o输出文件
-d按字典顺序排序a-z
-n按数字大小输出0-9
-r逆序输出z-a9-0
-k指定分类是域上的数字分类
-t域分割符;用非空格或tab键分割域
more/etc/passwd分页显示
sort–d/etc/passwd|more中间的|是反倒符号。
将前面处理的交给后面处理先排序。
后分页显示
sort–k3–n–r–t:
/etc/passwd|more
从大到小
wc[参数][文件名]
-c统计字符数量
-l统计行数
-w统计单词数量空格区分
diff[选项]文件/目录文件/目录
diff/etc/passwd/etc/passwd.bak
-q仅显示有无差异,不显示详细的信息
-c显示全部内文,并标出不同之处。
-b不检查空格字符的不同
-B不检查空白行
-r比较子目录中的文件。
grep搜索匹配支持正则表达式
grep
-c只打印匹配模式的行编号记数
-I在匹配文本时忽略大小写
-n在每行前显示其行编号
-v逆向输出,打印不匹配的行
-ffile要匹配的字符串列表在filezhong
grep‘[Tt]his'file1.txt设置大小写
grep‘^[^#]‘file2.txt不匹配行首
grep“s…n”file3.txt匹配任意字符
sed行编辑命令
s替代
i插入
a附加
d删除全部匹配的行
D删除首次匹配的行
sed可以做什么(”行”为基础)
删除
改变
添加
插入
替换
示例
sed–n'1,4p'/etc/passwdp是打印-n不显示原文件打印1-4行
sed‘/80/D'file.txt首次出现80的行进行删除
sed‘s/var/usr/g'file.txt将所有的var替换成usrg代表所有
sed'50,$s/help/man/g'file.txt替换从50行到最后一行的help替换为man前49不管
awk可以处理列,也可以处理行,可以定位到第几行,第几列
awk[选项]‘awk脚本'输入文件
-Ffs使用fs作为输入记录的字段分隔符=sort–t
-ffilename从文件filename读取awk_script(awk脚本)
-vvar=value为awk_script设置变量
awk的内置变量
变量
功能
默认
FS=大写F
输入字段分隔符
空格或tab
RS
输入记录分隔符
换行
OFS=outFS
输出字段分隔符
空格或tab
ORS
输出记录分隔符
换行
NF常用
当前记录非空字段的编号
NR常用
从所有文件读入的记录号
示例
awk–F:
‘{printNR,$1,$2}'/etc/passwd
awk–F:
‘{printNR,$1,$NF}'/etc/passwd$NF提取最后一行
awk–F:
‘NR%10==5{PRINTnr,$0}'/etc/passwdNR=当前处理的行数除10求余=5打印当前的行数,进行输出$0整行输出,比如5、15、25打印出来
awk–F:
‘NR==8,NR==13{printNR,$0}'/etc/passwd指定8行和13行。
awk工作原理(工具)
$NF$NR$1第一列$2第二列$0一整行
实际测试
awk–F:
‘{print$1,$3}'/etc/passwd
awk–F:
‘{print$1,$NF}'/etc/passwd
awk–F:
‘{printNR,$1,$NF}'/etc/passwdNR行号
awk–F:
‘NR==5,NR==8{printNR,$1,$NF}'/etc/passwd指定5-8行
awk–F:
‘NR%10==5{printNR,$1,$NF}'/etc/passwd除10求余
课程示例测试
1、grep–v“-”file.txt去除所有带负号的数据-v显示没有的没有的话则显示只有-的
2、wc-lfile.txt显示所有行数grep–v“-”file.txt|wc–l统计所有没有负数的
3、sort–n–r–k4file.txt|sed–n'1p'排序第四列没有分隔符(即空格),-n数字–r从大到小sed管道显示第一行sed–n不显示原文件
sort–n–r–k4file.txt|head-1读取第一个数据head第一行
4、awk‘{if($NF>3){print$0}}'file.txtNF最后一列大于3则打印一整行
5、awk‘{if($4>0,&&$4<15){print$0}}'file.txt列出第四列大于0小于15输出整行
awk‘{if($4>0,&&$4<15){print$0}}'file.txt|wc–l显示行数
练习:
1.grep和awk
awk‘{if($1>200801011){[print$0}}'file.txt
2、
处理命令回顾:
统计文本wc
文本排序sort
文本/目录对比diff
在文件中查找关键行grep/sed
在行文本中添、删、改sed
在列文本中显示指定列awk
在列文本中进行计算awk
在列文本进行条件选择awk
变量
1.获取本机主机名
#hostname
2.获取本系统版本号
#uname-r
3.获取cpu类型
4.获取cpu的工作频率
cat/proc/cpuinfo
5.获取内存使用情况
#free-m
6.获取硬盘使用情况
#df
变量类型及变量操作
1.本地变量(一般所指)
本地变量只存在用户当前shell中,当用户退出当前shell或开器一个新的shell,所设置的变量将会不存在
设置变量
#变量名=变量值
显示变量
#echo${变量名}
假设a=1显示则echo${a}
2.环境变量(用的非常少)
环境变量用于所有用户进程(经常称为子进程)。
登录进程称为父进程。
Shell中执行的用户进程均称为子进程。
不像本地变量,环境变量可用于所有子进程,这包括编辑器、脚本和应用
环境变量在用户注销时会消失,因此最好在$HOME/.bash_profile(/etc/profile)文件里直接定义
3.位置变量(跟脚本和函数有很大的关系)
位置变量表示$0,$1……$9(只有9个)
$0
$1
$2
$3
$4
$5
$6
$7
$8
$9
脚本名字
A
B
C
D
E
F
G
H
I
$0=当前脚本名称
向脚本中使用位置参数
向系统命令传递参数
4.特殊变量
$#传递到脚本的参数列表个数
$*($@)以一个单字符串显示所有向脚本传递的参数
$$脚本运行的当前进程ID号
$?
显示最后命令的退出状态。
0表示没有错误,其他任何值表明有错误。
引用的必要性
变量操作中,脚本执行变量赋值时最容易犯的一个错误就是引用错误
例:
echoabc*
echoabc‘*'
echoHitthestarbuttontoexit*
引用的方式
双引号(“)(需要排除以下几个)
使用双引号可以引用除$、`、\、字符外的任意字符或字符串
单引号(‘)(比较霸道,任何都可以转成字符)
与双引号类似,不同的是shell会忽略任何引用值。
换句话说,如果屏蔽了其特殊含义,会将引号里的所有字符,都作为一个字符串。
反引号(`)(将括号内的当作命令来执行)
用于设置系统命令的输出到变量。
shell将反引号中的内容作为一个系统命令,并执行其内容
反斜杠(\)
如果一个字符有特殊含义,反斜线防止shell误解其含义,即屏蔽其特殊含义。
下述字符包含有特殊意义:
&*+^$`”|?
脚本实例
1.Hello.sh
#!
/bin/bash
#Thisisthefirstscript
echo“Hello,World!
”
执行:
chmodu+xHello.sh
./Hello.sh
2.var.sh
#!
/bin/bash
echo$1
echo$2
echo$3
echo$4
echo$5
echo$6
echo$7
echo$8
echo$9
echo$10
3.#!
/bin/bash
echo–e“hostname\t`hostname`”
echo–e“OScore\t`uname-r`”
echo–e“CPUInfo\t`grep“modelname”/proc/cpuinfo|awk–F:
‘{print$2}'`”
ehco–e“CPUMHz\t`grep“MHz”/proc/cpuinfo|awk–F:
‘{print$2}'`”
echo–e“MEMTotal\t`free|awk‘$1=”Mem:
”{print$2}'`”
echo–e“DiskInfo\t`df|grepdev|awk‘{print$1$2}'`”
回顾:
脚本的结构与运行
变量的类型及用法
环境变量
本地变量
参数变量
特殊变量
第三天:
条件选择
大纲
应用实例分析
条件测试
if…else…fi
case…in…esac
实现功能菜单:
执行脚本后
按1,显示当前时间
按2,显示CPU负载
按3,显示剩余内存
按0,退出脚本
按其他字符,提示超出选择范围后退出
分析步骤。
#date+%T
uptimeawk截取
free–m
条件测试格式
#test–optionobj
#[-optionobj]
返回结果
1.表达式内容测试结果是真的
2.表达式内容测试结果是假的
测试的对象分类
执行结果(执行成功或失败)
文件(文件是否存在等)
文本(是否一致)
数字(数值比较)
条件测试的选项
选项
作用
-d
目录
-e
是否存在
-f
是否是普通文件
-s
文件大小是否等于0
-r
是否可读
-w
是否可写
-x
是否可执行
逻辑操作符号
选项
作用
-a
与操作
-o
或操作
!
非操作
实例:
#test–e/etc/passwd–a–e/etc/shadow中间是a与操作,则都为0才得0
#test–e/etc/passwd–o–e/etc/groups中间是o或操作,则有一真则真0
字符串操作符
==两个字符串相等
!
=两个字符串不相等
-z空字符串
-n非空字符串
实例:
#test–z$LOGNAME
#echo$LOGNAME
#echo$?
数值比较操作符
符号
说明
-eq
等于
-ne
不等于
-gt
大于
-lt
小于
-ge
大于等于
-le
小于等于
if…else…fi条件选择
if控制结构的基本格式:
if条件#判断开始可以是命令,也可以是test语句
then#如果条件为真反值真0则执行
命令1#执行命令1
else#如果条件为假反值假1则执行
命令2#执行命令2
fi#判断结束
实例(if…else…fi)1
inputtest.sh
#!
/bin/bash
#inputtest
echo–n“Enteryourname:
”
readname
#didtheuserjusthitreturn
if["${name}"==""]
then
echo“Youdidnotenteranyinformation”
else
echo“Yourname:
${name}”
fi
实例(if…else…fi)2
filecopy.sh
#!
/bin/bash
#filecopy
ifcp/etc/passwdpasswd.bak2>/dev/null2>/dev/null丢掉错误提示
then
echo“GoodCopy!
”
else
echo“`basename$0`:
error,couldnotcopy”
fi
if…else…fi的嵌套(两层的嵌套)
if条件1;then
if条件2;then
命令1
else
命令2
else
if条件3;then
命令3
else
命令4
fi
case…in…esac条件选择(比较灵活的方式)
case语句多用于较多分支判断
case格式:
(多种模式,只匹配和variable相等的模式)
casevariablein
模式1)命令1…;;
模式2)命令2…;;
esac
匹配模式
*匹配任意字符
?
匹配任意单字符
[]匹配字符范围
case…in.esac实例1
#!
/bin/bash
#caseselect
echo–n“enteranumberfrom1to5:
”
readNUM
case$NUMin
1)echo“youselect1″;;
2)echo“youselect2″;;
3)echo“youselect3″;;
4)echo“youselect4″;;
5)echo“youselect5″;;
*)echo“basename$Thisisnotbetween1and5″
esac
case…in.esac实例2
题目是:
学生的考试成绩是0-100分,在85以上的要提示youarethebest!
,在70-84显示yougetagoodmark!
,在60-74的显示comeon!
,60分以下显示Youmuststudyhard!
#!
/bin/bash
echo–n“pleaseinputyourmark:
”
readmark
case$markin
100|9[0-9]|8[5-9])echo“youarethebest!
”;;100、90-99、85-89
8[0-4]|7[0-9])echo“yougetagoodmark!
”;;80-84、70-79
7[0-4]|6[0-9])echo“comeon!
”;;70-74、60-69
[0-5][0-9])echo“Youmuststudyhard!
”;;00-59
esac
解决今天的问题
使用if…else…fi的方式对输入的变量进行判断。
在每个判断的分支上执行相应的语句。
menu.sh
#!
/bin/bash
clear
echo“——————–menu—————–”
echo“1)ShowTime”
echo“2)CPUload”
echo“3)Memoryfree”
echo“0)Exit”
echo“——————————————–”
echo-n“Enteryouchose[0-3]:
”
readNUM
if[${NUM}-lt0-o${NUM}-gt3]
then
echo“Thisisnotbetween0-3.”
else
if["${NUM}"=="1"]
then
echo“`date+%T`”
else
if["${NUM}"=="2"]
then
echo“`uptime|awk-F‘[,:
]‘‘{print$7}'`”
else
if["${NUM}"=="3"]
then
echo“`free-m|awk‘$1==”Mem