2016-08-18
授课内容:
shell编程基础(select 循环与菜单、函数)
yum管理、定制yum仓库
select 循环与菜单
select variable in list
do
循环体命令
done
1、select 循环主要用于创建菜单,按数字顺序排列的菜单项将显示在标准错误上,并显示PS3 提示符(默认是#?),可以重新定义PS3,等待用户输入
2、用户输入菜单列表中的某个数字,执行相应的命令,用户输入被保存在内置变量REPLY 中
[19:45 root@Centos7.2~]# sh 11.sh 1) add 2) delete 3) check 4) quit #? 2 delete #? 3 check #? [19:47 root@Centos7.2~]# !sh sh 11.sh 1) add 2) delete 3) check 4) quit please choose2 delete please choose [19:47 root@Centos7.2~]# cat !$ cat 11.sh #!/bin/bash PS3="please choose" select var in add delete check quit do echo $var done
3、select 是个无限循环,因此要记住用break 命令退出循环,或用exit 命令终止脚本。也可以按ctrl+c 退出循环。
4、select 经常和case 联合使用
[19:52 root@Centos7.2~]# cat !$ cat 11.sh #!/bin/bash PS3="please choose" select var in add delete check quit do case $var in add) echo "$var" ;; delete) echo "$var" ;; check) echo "$var" ;; quit) echo "quit" break ;; esac done [19:52 root@Centos7.2~]# !sh sh 11.sh 1) add 2) delete 3) check 4) quit please choose1 add please choose2 delete please choose3 check please choose4 quit
函数:
【请理解:一个函数相当于一个独立的脚本】
1、目的:代码的复用,提高效率
2、介绍:
a.函数function是由若干条shell命令组成的语句块,实现代码重用和模块化编程。
b.它与shell程序形式上是相似的,不同的是它不是一个单独的进程,不能独立运行,而是shell程序的一部分。
c.函数和shell程序比较相似,区别在于:
Shell程序在子Shell中运行
而Shell函数在当前Shell中运行。因此在当前Shell中,函数可以对shell中变量进行修改
3、当前shell已经创建的函数查看:set
4、定义函数(创建函数)
a.函数由两部分组成:函数名和函数体。【由于linux系统自用的方式是第二种,建议使用第二张格式来定义行数】
b.可将函数放在脚本文件中作为它的一部分【要放在脚本开头】,可放在只包含函数的单独文件中.
语法一:
function f_name{
...函数体...
}
语法二:
f_name() {
...函数体...
}
例子:
[19:58 root@Centos7.2~]# cat funtions #!/bin/bash filetype(){ read -p "please input the path:" path [[ ! -e $path ]] && { echo "the file is not exit";exit; } || type=`ls -ld $path|cut -c 1` case $type in l) echo "$path:link file" ;; d) echo "$path:directory" ;; -) echo "$path:common file" ;; *) echo "$path:other file" ;; esac }
5、函数使用
a.直接在脚本的开头创建函数
b. . /PATH/FUNCTION
c.source /PATH/FUNCTION
[20:06 root@Centos7.2~]# cat !$ cat filetype.sh #!/bin/bash . /root/funtions filetype
6、删除函数
与释放变量一样,unset FUNCTION
7、函数返回值
A.执行结果返回值
在平常的shell中引用命令的执行结果用反引号``,对于函数也一样,要引用函数的执行结果也是反引号``【】
B.执行状态返回值
与平常的shell脚本使用的一样:$?,此时$?返回的值就是定义的return值,注意,$?返回的是默认取决于函数中执行的最后一条命令的退出状态码或者是自定义的return值!
函数的退出状态码【与脚本的exit一样,执行return时停止执行,直接退出函数,用法与exit一样】:
(1) 默认取决于函数中执行的最后一条命令的退出状态码
(2) 自定义退出状态码,其格式为:
return 从函数中返回,用最后状态命令决定返回值
return 0 无错误返回。
return 1-255 有错误返回
[20:31 root@Centos7.2~]# cat sum.sh #!/bin/bash ADD () { a=7 b=8 echo "$(($a+$b))" } ADD echo "$?" #函数执行状态返回值 c=`ADD` #引用函数执行结果返回值 echo "$c" d=$(($c+10)) echo "$d" [20:31 root@Centos7.2~]# sh sum.sh 15 #函数执行状态返回值 0 #函数执行状态返回值 15 #引用函数执行结果返回值 25
yum管理:
YUM: YellowdogUpdate Modifier,rpm的前端程序,用来解决软件包相关依赖性,可以在多个库之间定位软件包
YUM是类C/S架构,client、server
yum repository: yum仓库、yum源(相当于server),yum repo,存储了众多rpm包,以及包的相关的元数据文件(放置于特定目录repodata下)
文件服务器:
ftp://
http://
file:///,最后一个/表示根
前两个是网络型,后者是本机型
由于本机(客户端)所有安装的rpm包都依赖yum仓库,所以,yum仓库必须要有相应的rpm包和依赖关系的包
yum的关键之处是要有可靠的repository,顾名思义,这是软件的仓库,它可以是http或ftp站点, 也可以是本地软件池,但必须包含rpm的header, header包括了rpm包的各种信息,包括描述,功能,提供的文件,依赖性等.正是收集了这些 header并加以分析,才能自动化地完成余下的任务。
yum客户端配置(有两个):
1、/etc/yum.conf:为所有仓库提供公共配置
2、/etc/yum.repos.d/*.repo:为仓库的指向提供配置
.repo仓库指向的定义:
[repositoryID] #必填
name=Some name for this repository
baseurl=url://path/to/repository/ #必填
enabled={1|0} #是否启用该yum仓库,
gpgcheck={1|0} #必填
gpgkey=URL
enablegroups={1|0}
failovermethod={roundrobin|priority}
默认为:roundrobin,意为随机挑选;
cost= 默认为1000
3、 yum源元数据(包的列表和相关数据),客户端访问的时候会把元数据repodata缓存到本地机器的缓存中,该元数据包括了包的列表目录,以及包之间的依赖关系。所以程序包一般安装完成后会自动删除,但是元数据文件不会删除,但是每次访问yum源时都会访问yum源的元数据校验码,如果校验码和本地的比较发生了变化,则会重新下载元数据,否则本地的yum源数据继续有效。
4、元数据创建命令:creatrepo,生成的元数据存放在repodata的目录之下
一个本地yum可以指向多个yum仓库(镜像),可以定于优先级
/etc/repos.d/*.repo:每个repo文件就是一个yum仓库的指向。
[root@localhost repodata]# cat /etc/yum.conf
[main] #名称:公共的
cachedir=/var/cache/yum/$basearch/$releasever
keepcache=0 #:对于缓存包的处理,0表示安装完就删除
debuglevel=2
logfile=/var/log/yum.log
exactarch=1 #:精确的平台包处理
obsoletes=1
gpgcheck=1 #:检查包的来源和合法性
plugins=1
installonly_limit=5
bugtracker_url=http://bugs.centos.org/set_project.php?project_id=19&ref=http://bugs.centos.org/bug_report_page.php?category=yum
distroverpkg=centos-release
5、man yum.conf,可以查看yum客户端配置的格式和说明,baseurl与mirrorlist一般不同时定义,只定义其中一个
6、安装程序包是默认安装最新版的,yum repolist:第一次运行时,下载源文件列表
7、有repodata的目录的URL就是yum源的URL!!/etc/repos.d/*.repo下的两个仓库名字不能相同!
RPM包的定制(编译安装):
1、为什么要定制:rpm包的版本会落后于源码包,甚至落后很多,如;源码包版本:bind-9.8.7,RPM包的版本: bind-9.7.2,这就会使得就得RPM包没有新版的功能或者旧版的漏洞没有修复,存在隐患。
2、定制:手动编译安装
手动编译的程序包最好安装在指定的一个文件路径,方便以后的删除管理。
编译安装的三步骤:
前提:准备开发环境(编译环境)
安装"Development Tools"和"Development Libraries"
1、tar #解压源码包
2、cd #进入解压的源码包目录
3、./configure
--help
--prefix=/path/to/somewhere
--sysconfdir=/PATH/TO/CONFFILE_PATH
功能:1、让用户选定编译特性;2、检查编译环境;
4、make
5、make install
tar xf tengine-1.4.2.tar.gz cd tegnine-1.4.2 ./configure --prefix=/usr/local/tengine --conf-path=/etc/tengine/tengine.conf make make install export PATH=$PATH:/usr/local/tengine/sbin/
编译安装完成后步骤:
1、修改PATH环境变量,以能够识别此程序的二进制文件路径;
修改/etc/profile文件
在/etc/profile.d/目录建立一个以.sh为名称后缀的文件,在里面定义export PATH=$PATH:/path/to/somewhere
2、默认情况下,系统搜索库文件的路径/lib, /usr/lib; 要增添额外搜寻路径:
在/etc/ld.so.conf.d/中创建以.conf为后缀名的文件,而后把要增添的路径直接写至此文件中(下次登陆生效);
# ldconfig:通知系统重新搜寻库文件
-v: 显示重新搜寻库的过程
3、头文件:输出给系统
默认:/usr/include
增添头文件搜寻路径,使用链接进行:
/usr/local/tengine/include/ /usr/include/
两种方式:
ln -s /usr/local/tengine/include/* /usr/include/ 或
ln -s /usr/local/tengine/include /usr/include/tengine
4、man文件路径:安装在--prefix指定的目录下的man目录;/usr/share/man
1、man -M /PATH/TO/MAN_DIR COMMAND(退出shell失效)
2、在/etc/man.config中添加一条MANPATH
./configure 比较重要的一个参数是 --prefix ,用--prefix 参数,我们可以指定软件安装目录;当我们不需要这个软件时,直接删除软件的目录就行了
【库就是函数】
make ,make install可以写成:make && make install
shell数组,不支持插入元素值
bash的数组支持稀疏格式(索引不连续)
定义:AA=(1 2 3 4 5):以空格隔开的元素
长度:${#AA[@]}
添加元素:AA[2]=VALUE
删除元素:unset AA[2]
删除数组:unset AA[@]
数组的截取:array{AA[@]:2:3},2表示跳过的元素,3表示截取的元素个数
元素的替换:array{AA[@]/5/cs}:把元素值为5的元素替换成cs【该方法不是真实改变数组,只是显示改变】
例子:生成10个随机数,采用冒泡算法进行升序或降序排序(利用shell数组)
#!/bin/bash #created by Hill #contact:mdlwolf@163.com #Version:1.0 #Create time:2016-08-20 18:37:37 #Description:生成10个随机数,采用冒泡算法进行升序或降序排序 declare -a rang for i in `seq 0 9` do rang[$i]=$RANDOM done echo "Before:${rang[@]}" for j in `seq 10` do for k in `seq $((10-$j))` do if [ ${rang[$[$k-1]]} -ge ${rang[$k]} ];then tmp=${rang[$k]} rang[$k]=${rang[$[$k-1]]} rang[$[$k-1]]=$tmp fi done done echo "After:${rang[@]}"
linux基础学习第十二天(shell函数、数组以及yum使用及编译安装)
原文地址:http://6638225.blog.51cto.com/6628225/1840746