linux基础学习第十二天(shell函数、数组以及yum使用及编译安装)

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

数组:

1、定义:存储多个元素的连续的内存空间,相当于多个变量的集合

2、数组名和索引

    declare -a ATTAY

    索引:编号从0开始,属于数值索引

3、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[@]}"

原创文章,作者:麦德良,如若转载,请注明出处:http://www.178linux.com/38223

(0)
麦德良麦德良
上一篇 2016-08-21
下一篇 2016-08-21

相关推荐

  • 马哥教育网络班22期+第六周课程练习

    vim编辑器的使用总结    vim编辑器是模式化的全屏文本编辑器,有三种基本模式:        编辑模式        输入模式   &…

    Linux干货 2016-10-24
  • 初入linux_基础(一)

    初入Linux知识点总结(一) 一、理论知识 1、时间点: 1946年 第一代计算机ENIAC诞生于美国宾州大学,特点:块头大、效率低 数学家冯诺•依曼提出计算机体系结构组成部分:计算器、运算器、存储器、输入设备、输出设备 1969年 UNIX在美国贝尔实验室诞生 1984年 GNU项目和软件基金会成立 1991年 Linux在芬兰赫尔辛基诞生 2、计算机的…

    Linux干货 2017-02-18
  • 包管理工具rpm和yum的用法

    包管理工具rpm和yum的用法 一、rpm的用法 rpm原本是Rde Hat Linux发行版专门用来管理Linux各项套件的程序,由于它遵循GPL规则且功能强大方便,因而广受欢迎。逐渐收到其他发行版的采用,RPM套件管理方式的出现,让Linux易于安装、升级,间接提升了Linux的适用性。 rpm用法:rpm [OPTION…] 1、rpm安装…

    Linux干货 2016-08-24
  • ifconfig

    ifconfig 命令详解

    Linux干货 2018-02-10
  • Linux磁盘管理(分区,格式化,文件系统、VFS、mount、fstab)

    Linux系统中数据存储在磁盘中,磁盘在冯诺依曼体系中属于输入输出外部存储对象,保存着重要的企业数据,对Linux系统中的磁盘管理尤其需要熟练掌握,由于企业目前使用的主流存储设备还是硬盘,所以这里只叙述硬盘的组织结构; 1.分区:    (1)低级格式化:       硬盘在出厂的时候厂家会做一次分区格式化,…

    Linux干货 2016-09-02
  • Ansible_variable

    Ansible变量        系统自动化让重复的工作变得更加容易,但是每个系统还是有一些细微的差别,变量就是如何处理系统之间的不同之处。这里将会列出变量的极大部分使用方法。   本文假设:你已经知道如何使用Ansible。知道inventory,facts等概念。   Ans…

    Linux干货 2015-11-26

评论列表(1条)

  • 马哥教育
    马哥教育 2016-08-21 21:58

    文章对当天的内容进行了详细的总结和梳理,yum源的配置和rpm包管理器的使用是必须要掌握的技能,需要多加练习,熟练掌握。