shell編程、yum的使用
一、shell編程
1、while的特殊使用
while 循環的特殊用法(遍歷文件的每一行):
while read line; do
循環體
done < /PATH/FROM/SOMEFILE
依次讀取/PATH/FROM/SOMEFILE 文件中的每一行,且將
行賦值給變量line
2、for的特殊使用
雙小括號方法,即((…)) 格式,也可以用于算術運算
雙小括號方法也可以使bash Shell 實現C 語言風格的變量操作
#I=10
#((I++))
for 循環的特殊格式:
for (( 控制變量初始化; 條件判斷表達式; 控制變量的修正表達式))
do
循環體
done
控制變量初始化:僅在運行到循環代碼段時執行一次
控制變量的修正表達式:每輪循環結束會先進行控制變量修正運算,而后再做條件判斷。
3、select的使用
*語句格式:select variable in list
do
循環體命令
done
*select 循環主要用于創建菜單,按數字順序排列的
示 菜單項將顯示在標準錯誤上,并顯示 PS3 提示符,
等待用戶輸入。
*用戶輸入菜單列表中的某個數字,執行相應的命令
*用戶輸入被保存在內置變量 REPLY
*與case的結合使用
select 用 是個無限循環,因此要記住用 break 命令退
用 出循環,或用 exit 按 命令終止腳本。也可以按 ctrl+c
退出循環。
select 和 經常和 case 聯合使用
與 for 略 循環類似,可以省略 in list,此時使用位置
參量
4、函數的使用
(1)函數介紹
函數function 是由若干條shell 命令組成的語句塊,實現代碼重用和模塊化編程。
它與shell 程序形式上是相似的,不同的是它不是一個單獨的進程,不能獨立運行,而是shell 程序的一部分。
函數和shell 程序比較相似,區別在于:
Shell 程序在子Shell 中運行
而Shell 函數在當前Shell 中運行。因此在當前Shell 中,函數可對shell中變量進行修改。
(2)函數的使用
函數的定義和使用:
可在交互式環境下定義函數
可將函數放在腳本文件中作為它的一部分
可放在只包含函數的單獨文件中
調用:函數只有被調用才會執行;
調用:給定函數名
函數名出現的地方,會被自動替換為函數代碼
函數的生命周期:被調用時創建,返回時終止
函數在使用前必須定義,因此應將函數定義放在腳本開始部分,直至
shell 首次發現它后才能使用
調用函數僅使用其函數名即可。
示例:
$cat func1
#!/bin/bash
# func1
hello()
{
echo "Hello there today's date is `date +%F`"
}
echo "now going to the function hello"
hello
echo "back from the function"
(3)函數文件的調用
可以將經常使用的函數存入函數文件,然后將函
數文件載入shell。 。
文件名可任意選取,但最好與相關任務有某種聯
系。例如:functions.main
一旦函數文件載入shell ,就可以在命令行或腳本
中調用函數??梢允褂?span style="font-family:Calibri">set 命令查看所有定義的函
數,其輸出列表包括已經載入shell 的所有函數。
若要改動函數,首先用unset 命令從shell 中刪除
函數。改動完畢后,再重新載入此文件。
*函數載入
函數文件已創建好后,要將它載入shell
定位 函數文件 并載入shell 的格式:
. filename 或 或 source filename
注意:此即< 點> < 空格> < 文件名>
這里 的文件名要帶正確路徑
示例:上例中 的 函數,可使用 如下命令:
$ . functions.main
*函數執行
執行shell 函數
要執行函數,簡單地鍵入函數名即可 :
示例:
$findit groups
/usr/bin/groups
/usr/local/backups/groups.bak
*函數刪除
刪除shell 函數
現在對函數做一些改動。首先刪除函數,使其對shell 不可用
使用unset 命令完成此 功能.
命令 格式為:
unset function_name
實例:
$unset findit
再鍵入set 命令,函數將不再顯示。
*函數參數的接收
傳遞參數給函數:調用函數時,在函數名后面以空白分隔。
給定參數列表即可;例如“testfunc arg1 arg2 …”
在函數體中當中,可使用$1, $2, … 調用這些參數;還
可以使用$@, $*, $#
*函數的作用范圍
變量作用域:
環境變量:當前shell 和子shell 有效
本地變量:只在當前shell 進程有效,為執行腳本會啟動。
專用子shell 進程;因此,本地變量的作用范圍是當前shell 腳本程序文件,包括腳本中的函數。
局部變量:函數的生命周期;函數結束時變量被自動銷毀。
注意:如果 函數中有局部變量,如果其名稱同本地變量, 使用局部變量。
在函數中定義局部變量的方法
local NAME=VALUE
5、函數的遞歸表示
函數間接或直接調用自身,這就是函數的遞歸使用。
示例: 示: 例: fact.sh
#!/bin/bash
#
fact() {
if [ $1 -eq 0 -o $1 -eq 1 ]; then
echo 1
else
echo $[$1*$(fact $[$1-1])]
fi
}
fact $1.
函數使用練習
1、寫一個函數實現兩個數字做為參數,返回最大值
然后source maxnumber.fun
max 3 5
即可得出結果
2、寫一個函數實現數字的加減乘除運算,例如輸入 1 + 2將得出正確結果。
經過簡單的調用便可使用。
二、yum的使用
大家都知道當我們去安裝一個程序包時,這個包可能依賴許多別的包,只有當別的包安裝后,這個包才可以正常使用。我們如果去為了安裝某個包,再去一個一個安裝其相依賴的包,會特別麻煩,所以我們的yum工具,可以很好地解決這個問題。幫助我們快速地解決這個問題。下面首先來介紹一下rpm的使用。
1、rpm 包管理
CentOS 系統上使用rpm 命令管理程序包:
安裝、卸載、升級、查詢、校驗、數據庫維護
安裝:
rpm {-i|–install} [install-options] PACKAGE_FILE…
-v: verbose
-vv:
-h: 以# 顯示程序包管理執行進度
rpm -ivh PACKAGE_FILE …
[install-options]選項
–test: 測試安裝,但不真正執行安裝;dry run 模式
–nodeps :忽略依賴關系
–replacepkgs | replacefiles
–nosignature: 不檢查來源合法性
–nodigest :不檢查包完整性
–noscipts :不執行程序包腳本片斷
%pre: ; 安裝前腳本; –nopre
%post: ; 安裝后腳本; –nopost
%preun: ; 卸載前腳本; –nopreun
%postun: 卸載后腳本; –nopostun
2、rpm 包升級
升級:
rpm {-U|–upgrade} [install-options] PACKAGE_FILE …
rpm {-F|–freshen} [install-options] PACKAGE_FILE …
upgrade :安裝有舊版程序包,則“升級”
如果不存在舊版程序包,則“安裝”
freshen :安裝有舊版程序包,則“升級”
如果不存在舊版程序包,則不執行升級操作
rpm -Uvh PACKAGE_FILE …
rpm -Fvh PACKAGE_FILE …
–oldpackage :降級
–force: 強行升級
3、包查詢
rpm {-q|–query} [select-options] [query-options]
[select-options]
-a: 所有包
-f: 查看指定的文件由哪個程序包安裝生成
-p rpmfile :針對尚未安裝的程序包文件做查詢操作;
–whatprovides CAPABILITY :查詢指定的 CAPABILITY
由哪個包所提供
–whatrequires CAPABILITY :查詢指定的 CAPABILITY 被
哪個包所依賴
v rpm2cpio 包文件|cpio –itv 預覽包內文件
v rpm2cpio 包文件|cpio –id “*.conf” ”
舉例:定向解壓需要的文件,命令為:rpm2cpio tree-1.5.3-3.el6.x86_64.rpm |cpio -idv ./usr/bin/tree
[query-options]
–changelog :查詢rpm 包的changelog
-c: 查詢程序的配置文件
-d: 查詢程序的文檔
-i: information
-l: 查看指定的程序包安裝后生成的所有文件;
–scripts :程序包自帶的腳本片斷
-R: 查詢指定的程序包所依賴的CAPABILITY; ;
–provides: 列出指定程序包所提供的CAPABILITY;
查詢用法:
-qi PACKAGE, -qf FILE, -qc PACKAGE, -ql
PACKAGE, -qd PACKAGE
-qpi PACKAGE_FILE, -qpl PACKAGE_FILE, …
-qa
3、rpm卸載與檢驗
rpm {-e|–erase} [–allmatches] [–nodeps] [–
noscripts] [–notriggers] [–test] PACKAGE_NAME …
rpm {-V|–verify} [select-options] [verify-options]
S file Size differs
M Mode differs (includes permissions and file type)
5 digest (formerly MD5 sum) differs
D Device major/minor number mismatch
L readLink(2) path mismatch
U User ownership differs
G Group ownership differs
T mTime differs
P capabilities differ
導入所需要公鑰:
rpm -K|checksig rpmfile 檢查包的完整性和簽名
rpm –import / etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7
CentOS 7 發行版光盤提供: RPM-GPG-KEY-CentOS-7
rpm -qa gpg-pubkey*
4、數據庫重建:
/var/lib/rpm
v rpm {–initdb|–rebuilddb}
initdb: 初始化
如果事先不存在數據庫,則新建之
否則,不執行任何操作
rebuilddb :重建
無論當前存在與否,直接重新創建數據庫
5、yum 配置文件
yum 客戶端配置文件:
/etc/yum.conf :為所有倉庫提供公共配置
/etc/yum.repos.d/*.repo :為倉庫的指向提供配置
倉庫指向的定義:
[repositoryID]
name=Some name for this repository
baseurl=url://path/to/repository/
enabled={1|0}
gpgcheck={1|0}
gpgkey=URL
enablegroups={1|0}
failovermethod={roundrobin|priority}
默認為:roundrobin ,意為隨機挑選;
cost= 默認為1000
練習:tree的一個文件如/usr/bin/tree被誤刪除,如何恢復tree的功能。
(1)將光盤中的tree的安裝包的特定文件安裝即可
(2)預覽:rpm2cpio tree-1.5.3-3.el6.x86_64.rpm |cpio -itv
課后練習
這兩個習題較難,沒有做出來,等老師講解了我再將答案寫出來。
1、斐波那契數列又稱黃金分割數列,因數學家列昂納多·斐波那契以兔子繁殖為例子而引入,故又稱為“兔子數列”,指的是這樣一個數列:0、1、1、2、3、5、8、13、21、34、……,斐波納契數列以如下被以遞歸的方法定義:F(0)=0,F(1)=1,F(n)=F(n-1)+F(n-2)(n≥2)
寫一個函數,求n階斐波那契數列
2、漢諾塔(又稱河內塔)問題是源于印度一個古老傳說。大梵天創造世界的時候做了三根金剛石柱子,在一根柱子上從下往上按照大小順序摞著64片黃金圓盤。大梵天命令婆羅門把圓盤從下面開始按大小順序重新擺放在另一根柱子上。并且規定,在小圓盤上不能放大圓盤,在三根柱子之間一次只能移動一個圓盤。
利用函數,實現N片盤的漢諾塔的移動步驟
原創文章,作者:178babyhanggege,如若轉載,請注明出處:http://www.www58058.com/37946
文章對腳本循環語句的語法總結的好,同時rpm管理工具與yum倉庫的配置是基本技能需要熟練掌握,課后練習不會不要等別人要養成自主學習的習慣,不會可以詢問其他人,或者goole,百度,都能找到答案。學習是自己的事哦。