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.函數由兩部分組成:函數名和函數體?!居捎趌inux系統自用的方式是第二種,建議使用第二張格式來定義行數】

        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.www58058.com/38223

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

相關推薦

  • 網絡26期 第一周作業

    1、描述計算機的組成及其功能。 計算機由cpu、存儲器(內存)、輸入設備(Input)、輸出設備(Output),其中cpu中的運算器和控制器是必要的,這擁有以上五個部件就可以組成一個能正常工作的計算機,但是內存無法永久保存數據于是還需要一個硬盤來永久保存數據,硬盤也是存儲器的一種但是它卻是一個io設備,即至少是輸入或者輸出設備中的一種.所以我將其分開來說了…

    Linux干貨 2017-01-18
  • CentOS系統詳解(啟動流程、kickstart)&bash腳本編程之while/函數用法

    1、請詳細描述CentOS系統的啟動流程(詳細到每個過程系統做了哪些事情) 2、為運行于虛擬機上的CentOS 6添加一塊新硬件,提供兩個主分區; (1) 為硬盤新建兩個主分區;并為其安裝grub; (2) 為硬盤的第一個主分區提供內核和ramdisk文件; 為第二個分區提供rootfs; (3) 為rootfs提供bash、ls、cat程序及所依賴的庫文件…

    Linux干貨 2016-11-28
  • N22-第5周博客作業

    1、顯示當前系統上root、fedora或user1用戶的默認shell; grep -E "^(root|fedora|user1)\>" /etc/passwd | cut -d: -f7 2、找出/etc/rc.d/init.d/functions文件中某單…

    Linux干貨 2016-12-05
  • redis-cli的一些有趣也很有用的功能

    redis-cli我們最常用的三個參數就是-h、-p、-a選項,分配用來指定連接的redis-server的host、port和登錄密碼。通過redis-cli –help發現,redis-cli還提供了其他很多的參數和功能。 1)-x-x選項從標準輸入(stdin)讀取最后一個參數。 比如從管道中讀取輸入: echo -en &quot…

    Linux干貨 2016-04-13
  • 磁盤分區

      1、創建一個10G分區,并格式化為ext4文件系統;    (1)要求其block大小為2048,預留空間百分比為2,卷標為MYDATA,默認掛載屬性包含acl;   (2)掛載至/data/mydata目錄,要求掛載時禁止程序自動運行,且不更新文件的訪問時間戳 第一步:創建一個10G的分區     [r…

    Linux干貨 2016-12-18
  • 談shell命令的神奇組合以及對腳本的影響

    shell命令是我們與機器交互的基本溝通翻譯官。我們要告訴計算機的很多事情都由它來翻譯,而shell的神奇之處就在于支持命令聯合使用,現在我就來講講基本的命令組合引用。1.管道應用:命令 | 命令  ,前面的命令的結果可以直接作為后面命令的輸出,省卻了一個變量做存儲。2.文本段落提取;我們可以用 組合命令 通常為 cat 某文件 | (head -…

    Linux干貨 2017-04-02

評論列表(1條)

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

    文章對當天的內容進行了詳細的總結和梳理,yum源的配置和rpm包管理器的使用是必須要掌握的技能,需要多加練習,熟練掌握。

欧美性久久久久