2016-08-18php
授課內容:前端
shell編程基礎(select 循環與菜單、函數)linux
yum管理、定製yum倉庫 算法
select 循環與菜單shell
select variable in list編程
docentos
循環體命令數組
done 緩存
一、select 循環主要用於建立菜單,按數字順序排列的菜單項將顯示在標準錯誤上,並顯示PS3 提示符(默認是#?),能夠從新定義PS3,等待用戶輸入bash
二、用戶輸入菜單列表中的某個數字,執行相應的命令,用戶輸入被保存在內置變量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
三、select 是個無限循環,所以要記住用break 命令退出循環,或用exit 命令終止腳本。也能夠按ctrl+c 退出循環。
四、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
函數:
【請理解:一個函數至關於一個獨立的腳本】
一、目的:代碼的複用,提升效率
二、介紹:
a.函數function是由若干條shell命令組成的語句塊,實現代碼重用和模塊化編程。
b.它與shell程序形式上是類似的,不一樣的是它不是一個單獨的進程,不能獨立運行,而是shell程序的一部分。
c.函數和shell程序比較類似,區別在於:
Shell程序在子Shell中運行
而Shell函數在當前Shell中運行。所以在當前Shell中,函數能夠對shell中變量進行修改
三、當前shell已經建立的函數查看:set
四、定義函數(建立函數)
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 }
五、函數使用
a.直接在腳本的開頭建立函數
b. . /PATH/FUNCTION
c.source /PATH/FUNCTION
[20:06 root@Centos7.2~]# cat !$ cat filetype.sh #!/bin/bash . /root/funtions filetype
六、刪除函數
與釋放變量同樣,unset FUNCTION
七、函數返回值
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客戶端配置(有兩個):
一、/etc/yum.conf:爲全部倉庫提供公共配置
二、/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
三、 yum源元數據(包的列表和相關數據),客戶端訪問的時候會把元數據repodata緩存到本地機器的緩存中,該元數據包括了包的列表目錄,以及包之間的依賴關係。因此程序包通常安裝完成後會自動刪除,可是元數據文件不會刪除,可是每次訪問yum源時都會訪問yum源的元數據校驗碼,若是校驗碼和本地的比較發生了變化,則會從新下載元數據,不然本地的yum源數據繼續有效。
四、元數據建立命令: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
五、man yum.conf,能夠查看yum客戶端配置的格式和說明,baseurl與mirrorlist通常不一樣時定義,只定義其中一個
六、安裝程序包是默認安裝最新版的,yum repolist:第一次運行時,下載源文件列表
七、有repodata的目錄的URL就是yum源的URL!!/etc/repos.d/*.repo下的兩個倉庫名字不能相同!
RPM包的定製(編譯安裝):
一、爲何要定製:rpm包的版本會落後於源碼包,甚至落後不少,如;源碼包版本:bind-9.8.7,RPM包的版本: bind-9.7.2,這就會使得就得RPM包沒有新版的功能或者舊版的漏洞沒有修復,存在隱患。
二、定製:手動編譯安裝
手動編譯的程序包最好安裝在指定的一個文件路徑,方便之後的刪除管理。
編譯安裝的三步驟:
前提:準備開發環境(編譯環境)
安裝"Development Tools"和"Development Libraries"
一、tar #解壓源碼包
二、cd #進入解壓的源碼包目錄
三、./configure
--help
--prefix=/path/to/somewhere
--sysconfdir=/PATH/TO/CONFFILE_PATH
功能:一、讓用戶選定編譯特性;二、檢查編譯環境;
四、make
五、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/
編譯安裝完成後步驟:
一、修改PATH環境變量,以可以識別此程序的二進制文件路徑;
修改/etc/profile文件
在/etc/profile.d/目錄創建一個以.sh爲名稱後綴的文件,在裏面定義export PATH=$PATH:/path/to/somewhere
二、默認狀況下,系統搜索庫文件的路徑/lib, /usr/lib; 要增添額外搜尋路徑:
在/etc/ld.so.conf.d/中建立以.conf爲後綴名的文件,然後把要增添的路徑直接寫至此文件中(下次登錄生效);
# ldconfig:通知系統從新搜尋庫文件
-v: 顯示從新搜尋庫的過程
三、頭文件:輸出給系統
默認:/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
四、man文件路徑:安裝在--prefix指定的目錄下的man目錄;/usr/share/man
一、man -M /PATH/TO/MAN_DIR COMMAND(退出shell失效)
二、在/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[@]}"