shell编程、yum的使用
一、shell编程
1、while的特殊使用
while 循环的特殊用法(遍历文件的每一行):
while read line; do
循环体
done < /PATH/FROM/SOMEFILE
依次读取/PATH/FROM/SOMEFILE 文件中的每一行,且将
行赋值给变量line
2、for的特殊使用
双小括号方法,即((…)) 格式,也可以用于算术运算
双小括号方法也可以使bash Shell 实现C 语言风格的变量操作
#I=10
#((I++))
for 循环的特殊格式:
for (( 控制变量初始化; 条件判断表达式; 控制变量的修正表达式))
do
循环体
done
控制变量初始化:仅在运行到循环代码段时执行一次
控制变量的修正表达式:每轮循环结束会先进行控制变量修正运算,而后再做条件判断。
3、select的使用
*语句格式:select variable in list
do
循环体命令
done
*select 循环主要用于创建菜单,按数字顺序排列的
示 菜单项将显示在标准错误上,并显示 PS3 提示符,
等待用户输入。
*用户输入菜单列表中的某个数字,执行相应的命令
*用户输入被保存在内置变量 REPLY
*与case的结合使用
select 用 是个无限循环,因此要记住用 break 命令退
用 出循环,或用 exit 按 命令终止脚本。也可以按 ctrl+c
退出循环。
select 和 经常和 case 联合使用
与 for 略 循环类似,可以省略 in list,此时使用位置
参量
4、函数的使用
(1)函数介绍
函数function 是由若干条shell 命令组成的语句块,实现代码重用和模块化编程。
它与shell 程序形式上是相似的,不同的是它不是一个单独的进程,不能独立运行,而是shell 程序的一部分。
函数和shell 程序比较相似,区别在于:
Shell 程序在子Shell 中运行
而Shell 函数在当前Shell 中运行。因此在当前Shell 中,函数可对shell中变量进行修改。
(2)函数的使用
函数的定义和使用:
可在交互式环境下定义函数
可将函数放在脚本文件中作为它的一部分
可放在只包含函数的单独文件中
调用:函数只有被调用才会执行;
调用:给定函数名
函数名出现的地方,会被自动替换为函数代码
函数的生命周期:被调用时创建,返回时终止
函数在使用前必须定义,因此应将函数定义放在脚本开始部分,直至
shell 首次发现它后才能使用
调用函数仅使用其函数名即可。
示例:
$cat func1
#!/bin/bash
# func1
hello()
{
echo "Hello there today's date is `date +%F`"
}
echo "now going to the function hello"
hello
echo "back from the function"
(3)函数文件的调用
可以将经常使用的函数存入函数文件,然后将函
数文件载入shell。 。
文件名可任意选取,但最好与相关任务有某种联
系。例如:functions.main
一旦函数文件载入shell ,就可以在命令行或脚本
中调用函数。可以使用set 命令查看所有定义的函
数,其输出列表包括已经载入shell 的所有函数。
若要改动函数,首先用unset 命令从shell 中删除
函数。改动完毕后,再重新载入此文件。
*函数载入
函数文件已创建好后,要将它载入shell
定位 函数文件 并载入shell 的格式:
. filename 或 或 source filename
注意:此即< 点> < 空格> < 文件名>
这里 的文件名要带正确路径
示例:上例中 的 函数,可使用 如下命令:
$ . functions.main
*函数执行
执行shell 函数
要执行函数,简单地键入函数名即可 :
示例:
$findit groups
/usr/bin/groups
/usr/local/backups/groups.bak
*函数删除
删除shell 函数
现在对函数做一些改动。首先删除函数,使其对shell 不可用
使用unset 命令完成此 功能.
命令 格式为:
unset function_name
实例:
$unset findit
再键入set 命令,函数将不再显示。
*函数参数的接收
传递参数给函数:调用函数时,在函数名后面以空白分隔。
给定参数列表即可;例如“testfunc arg1 arg2 …”
在函数体中当中,可使用$1, $2, … 调用这些参数;还
可以使用$@, $*, $#
*函数的作用范围
变量作用域:
环境变量:当前shell 和子shell 有效
本地变量:只在当前shell 进程有效,为执行脚本会启动。
专用子shell 进程;因此,本地变量的作用范围是当前shell 脚本程序文件,包括脚本中的函数。
局部变量:函数的生命周期;函数结束时变量被自动销毁。
注意:如果 函数中有局部变量,如果其名称同本地变量, 使用局部变量。
在函数中定义局部变量的方法
local NAME=VALUE
5、函数的递归表示
函数间接或直接调用自身,这就是函数的递归使用。
示例: 示: 例: fact.sh
#!/bin/bash
#
fact() {
if [ $1 -eq 0 -o $1 -eq 1 ]; then
echo 1
else
echo $[$1*$(fact $[$1-1])]
fi
}
fact $1.
函数使用练习
1、写一个函数实现两个数字做为参数,返回最大值
然后source maxnumber.fun
max 3 5
即可得出结果
2、写一个函数实现数字的加减乘除运算,例如输入 1 + 2将得出正确结果。
经过简单的调用便可使用。
二、yum的使用
大家都知道当我们去安装一个程序包时,这个包可能依赖许多别的包,只有当别的包安装后,这个包才可以正常使用。我们如果去为了安装某个包,再去一个一个安装其相依赖的包,会特别麻烦,所以我们的yum工具,可以很好地解决这个问题。帮助我们快速地解决这个问题。下面首先来介绍一下rpm的使用。
1、rpm 包管理
CentOS 系统上使用rpm 命令管理程序包:
安装、卸载、升级、查询、校验、数据库维护
安装:
rpm {-i|–install} [install-options] PACKAGE_FILE…
-v: verbose
-vv:
-h: 以# 显示程序包管理执行进度
rpm -ivh PACKAGE_FILE …
[install-options]选项
–test: 测试安装,但不真正执行安装;dry run 模式
–nodeps :忽略依赖关系
–replacepkgs | replacefiles
–nosignature: 不检查来源合法性
–nodigest :不检查包完整性
–noscipts :不执行程序包脚本片断
%pre: ; 安装前脚本; –nopre
%post: ; 安装后脚本; –nopost
%preun: ; 卸载前脚本; –nopreun
%postun: 卸载后脚本; –nopostun
2、rpm 包升级
升级:
rpm {-U|–upgrade} [install-options] PACKAGE_FILE …
rpm {-F|–freshen} [install-options] PACKAGE_FILE …
upgrade :安装有旧版程序包,则“升级”
如果不存在旧版程序包,则“安装”
freshen :安装有旧版程序包,则“升级”
如果不存在旧版程序包,则不执行升级操作
rpm -Uvh PACKAGE_FILE …
rpm -Fvh PACKAGE_FILE …
–oldpackage :降级
–force: 强行升级
3、包查询
rpm {-q|–query} [select-options] [query-options]
[select-options]
-a: 所有包
-f: 查看指定的文件由哪个程序包安装生成
-p rpmfile :针对尚未安装的程序包文件做查询操作;
–whatprovides CAPABILITY :查询指定的 CAPABILITY
由哪个包所提供
–whatrequires CAPABILITY :查询指定的 CAPABILITY 被
哪个包所依赖
v rpm2cpio 包文件|cpio –itv 预览包内文件
v rpm2cpio 包文件|cpio –id “*.conf” ”
举例:定向解压需要的文件,命令为:rpm2cpio tree-1.5.3-3.el6.x86_64.rpm |cpio -idv ./usr/bin/tree
[query-options]
–changelog :查询rpm 包的changelog
-c: 查询程序的配置文件
-d: 查询程序的文档
-i: information
-l: 查看指定的程序包安装后生成的所有文件;
–scripts :程序包自带的脚本片断
-R: 查询指定的程序包所依赖的CAPABILITY; ;
–provides: 列出指定程序包所提供的CAPABILITY;
查询用法:
-qi PACKAGE, -qf FILE, -qc PACKAGE, -ql
PACKAGE, -qd PACKAGE
-qpi PACKAGE_FILE, -qpl PACKAGE_FILE, …
-qa
3、rpm卸载与检验
rpm {-e|–erase} [–allmatches] [–nodeps] [–
noscripts] [–notriggers] [–test] PACKAGE_NAME …
rpm {-V|–verify} [select-options] [verify-options]
S file Size differs
M Mode differs (includes permissions and file type)
5 digest (formerly MD5 sum) differs
D Device major/minor number mismatch
L readLink(2) path mismatch
U User ownership differs
G Group ownership differs
T mTime differs
P capabilities differ
导入所需要公钥:
rpm -K|checksig rpmfile 检查包的完整性和签名
rpm –import / etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7
CentOS 7 发行版光盘提供: RPM-GPG-KEY-CentOS-7
rpm -qa gpg-pubkey*
4、数据库重建:
/var/lib/rpm
v rpm {–initdb|–rebuilddb}
initdb: 初始化
如果事先不存在数据库,则新建之
否则,不执行任何操作
rebuilddb :重建
无论当前存在与否,直接重新创建数据库
5、yum 配置文件
yum 客户端配置文件:
/etc/yum.conf :为所有仓库提供公共配置
/etc/yum.repos.d/*.repo :为仓库的指向提供配置
仓库指向的定义:
[repositoryID]
name=Some name for this repository
baseurl=url://path/to/repository/
enabled={1|0}
gpgcheck={1|0}
gpgkey=URL
enablegroups={1|0}
failovermethod={roundrobin|priority}
默认为:roundrobin ,意为随机挑选;
cost= 默认为1000
练习:tree的一个文件如/usr/bin/tree被误删除,如何恢复tree的功能。
(1)将光盘中的tree的安装包的特定文件安装即可
(2)预览:rpm2cpio tree-1.5.3-3.el6.x86_64.rpm |cpio -itv
课后练习
这两个习题较难,没有做出来,等老师讲解了我再将答案写出来。
1、斐波那契数列又称黄金分割数列,因数学家列昂纳多·斐波那契以兔子繁殖为例子而引入,故又称为“兔子数列”,指的是这样一个数列:0、1、1、2、3、5、8、13、21、34、……,斐波纳契数列以如下被以递归的方法定义:F(0)=0,F(1)=1,F(n)=F(n-1)+F(n-2)(n≥2)
写一个函数,求n阶斐波那契数列
2、汉诺塔(又称河内塔)问题是源于印度一个古老传说。大梵天创造世界的时候做了三根金刚石柱子,在一根柱子上从下往上按照大小顺序摞着64片黄金圆盘。大梵天命令婆罗门把圆盘从下面开始按大小顺序重新摆放在另一根柱子上。并且规定,在小圆盘上不能放大圆盘,在三根柱子之间一次只能移动一个圆盘。
利用函数,实现N片盘的汉诺塔的移动步骤
原创文章,作者:178babyhanggege,如若转载,请注明出处:http://www.178linux.com/37946
评论列表(1条)
文章对脚本循环语句的语法总结的好,同时rpm管理工具与yum仓库的配置是基本技能需要熟练掌握,课后练习不会不要等别人要养成自主学习的习惯,不会可以询问其他人,或者goole,百度,都能找到答案。学习是自己的事哦。