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