2016-08-16
授課內容:
shell腳本基礎:循環,for,while,until(未講完)
軟件包管理(未講完):
?軟件運行環境
?軟件包基礎
?Rpm包管理
循環執行
將某代碼段重復運行多次
重復運行多少次:
循環次數事先已知
循環次數事先未知
有進入條件和退出條件
循環控制語句:
break:【提結束循環,循環將不再執行】指前面的循環退出,退出后還繼續執行后面的命令,而exit則是退出整個腳本
continue:【提結束本輪循環,而進入下一輪循環】當碰到continue語句時,continue后面的語句不再執行,直接提前進入下一輪循環
for循環
for 變量名in 列表;do
循環體
done
列表:以空格隔開的包括數字、字符、文件等個體
執行機制:
依次將列表中的元素賦值給“變量名”; 每次賦值后即執行一次循環體; 直到列表中的元素耗盡,循環結束
例如:
寫一個腳本,提示輸入正整數n的值,計算1+2+3+…n的總和
#!/bin/bash #Version:1.0 #Create time:2016-08-15 13:51:02 #Description:寫一個腳本,提示輸入正整數n的值,計算1+2+3+…n的總和 let SUM=0 read -p "input num: " NUM expr $NUM + 0 &> /dev/null [ $? -ne 0 ] && echo "please input digitnum" && exit 100 [ $NUM -le 0 ] && echo "input the right num" && exit 99 for I in `seq $NUM` do SUM=$(($SUM+$I)) done echo "the sum is $SUM" unset SUM unset NUM
while循環:
while CONDITION; do
循環體
done
進入條件:CONDITION為true;
退出條件:CONDITION為false
即當循環體是真是執行循環體,循環體是假是退出循環體
例如: 求100以內所有正整數之和 #!/bin/bash #Version:1.0 #Create time:2016-08-15 14:36:00 #Description:求100以內所有正整數之和 let SUM=0 let NUM=1 while [ $NUM -le 100 ] do SUM=$(($SUM+$NUM)) NUM=$(($NUM+1)) done echo "1+2+...+100=$SUM" until循環 until CONDITION; do 循環體 done
進入條件:CONDITION 為false
退出條件:CONDITION 為true
【】即當循環體是真是執行循環體,循環體是假是退出循環體,與while循環相反
軟件包管理:
軟件運行環境
程序源代碼–> 預處理–> 編譯–> 匯編–> 鏈接
注釋內容在預處理時被去掉
ABI:Application Binary Interface
Windows與Linux不兼容,如ls命令不能再windows運行,因為uwindows和linux的ABI接口不同
包管理器:
二進制應用程序的組成部分:
二進制文件、庫文件、配置文件、幫助文件
程序包管理器:
debian:deb文件, dpkg包管理器
redhat: rpm文件, rpm包管理器,SUSE系列也是使用rpm包管理器
rpm: RedhatPackage Manager(初期)
RPM Package Manager (行業標準,類似GNU)
包命名
源代碼:name-VERSION.tar.gz|bz2|xz
VERSION: major.minor.release
rpm包命名方式:
name-VERSION-release.arch.rpm
例:bash-4.2.46-19.el7.x86_64.rpm
VERSION: major.minor.release(即是源代碼的命名方式)
release:release.OS
OS:el7,指的是RHEL7的版本
常見的arch:
x86: i386, i486, i586, i686(32位平臺)
x86_64: x64, x86_64, amd64(64位平臺)
powerpc: ppc
跟平臺無關:noarch
包:一個rpm包里面包含多個文件
Application-VERSION-ARCH.rpm: 主包
Application-devel-VERSION-ARCH.rpm開發子包
Application-utils-VERSION-ARHC.rpm其它子包
Application-libs-VERSION-ARHC.rpm其它子包
?包之間:可能存在依賴關系,甚至循環依賴
?解決依賴包管理工具:
yum:rpm包管理器的前端工具
apt-get:deb包管理器前端工具
由于一個二進制的執行程序包是由二進制文件、庫文件、幫助文件和配置文件組成,所以每個包文件里包括:
1、包文件組成(每個包獨有)
RPM包內的文件
RPM的元數據,如名稱,版本,依賴性,描述等
安裝或卸載時運行的腳本
2、數據庫(公共)
程序包名稱及版本
依賴關系
功能說明
包安裝后生成的各文件路徑及校驗碼信息
ldd:查看命令的庫文件
[17:13 root@Centos7.2~]# ldd /usr/bin/ls linux-vdso.so.1 => (0x00007ffe41576000) libselinux.so.1 => /lib64/libselinux.so.1 (0x00007fc41c3e6000) libcap.so.2 => /lib64/libcap.so.2 (0x00007fc41c1e1000) libacl.so.1 => /lib64/libacl.so.1 (0x00007fc41bfd7000) libc.so.6 => /lib64/libc.so.6 (0x00007fc41bc16000) libpcre.so.1 => /lib64/libpcre.so.1 (0x00007fc41b9b5000) liblzma.so.5 => /lib64/liblzma.so.5 (0x00007fc41b78f000) libdl.so.2 => /lib64/libdl.so.2 (0x00007fc41b58b000) /lib64/ld-linux-x86-64.so.2 (0x00007fc41c61e000) libattr.so.1 => /lib64/libattr.so.1 (0x00007fc41b386000) libpthread.so.0 => /lib64/libpthread.so.0 (0x00007fc41b169000)
管理程序包的方式:
后端包管理器:rpm
使用前端工具:yum, dnf
rpm :
1、安裝
rpm {-i|–install} [install-options] PACKAGE_FILE…
-v:顯示詳細情況
-h:以#顯示進度
-ql:查詢程序的所有文件及路徑
[install-options]:
–test: 測試安裝,但不真正執行安裝;dry run模式
–nodeps:忽略依賴關系
–replacepkgs| replacefiles
–nosignature: 不檢查來源合法性
–nodigest:不檢查包完整性
–noscipts:不執行程序包腳本片斷
%pre: 安裝前腳本;–nopre
%post: 安裝后腳本;–nopost
%preun: 卸載前腳本;–nopreun
%postun: 卸載后腳本;–nopostun
2、升級
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: 強行升級
課后作業:
一、用until實現下列作業
1、每隔3秒鐘到系統上獲取已經登錄的用戶的信息;如果發現用戶hacker登錄,則將登錄時間和主機記錄于日志/var/log/login.log中,并提示該用戶退出系統。
#!/bin/bash #Version:1.0 #Create time:2016-08-17 09:53:04 #Description:每隔3秒鐘到系統上獲取已經登錄的用戶的信息;如果發現用戶nihaoma登錄,則將登錄時間和主機記錄于日志/var/log/login.log中, 并提示該用戶退出系統。 until who|grep "nihaoma" &> /dev/null do sleep 3 done echo `who|grep 'nihaoma' |tr -s ' ' ':'|cut -d: -f3-6` >> /var/log/login.log &> /dev/null mail -s "please logout" nihaoma &> /dev/null
2、隨機生成10以內的數字,實現猜字游戲,提示比較大或小,相等則退出
#!/bin/bash #Version:1.0 #Create time:2016-08-17 10:24:52 #Description:隨機生成10以內的數字,實現猜字游戲,提示比較大或小,相等則退出 NUM=$(($RANDOM%11)) read -p "input a NUM: " NUM1 ! expr $NUM1 + 1 &> /dev/null && echo "please input a num." && exit 100 until [ $NUM1 -eq $NUM ] do [ $NUM1 -lt $NUM ] && echo "litter" || echo "bigger" read -p "input a NUM: " NUM1 until expr $NUM1 + 1 &> /dev/null do echo "please input a num." read -p "input a NUM: " NUM1 done done echo "yes the NUM is $NUM"
3、編寫腳本,求100以內所有正整數之和
#!/bin/bash #Version:1.0 #Create time:2016-08-17 10:48:15 #Description:編寫腳本,求100以內所有正整數之和 let I=0 let SUM=0 until [ $I -gt 100 ] do SUM=$(($I+$SUM)) I=$(($I+1)) done echo "the sum is $SUM"
4、編寫腳本,通過ping命令探測172.16.250.1-254范圍內的所有主機的在線狀態,統計在線主機和離線主機各多少。
let NUM=1 COUNT1=0 COUNT2=0 until [ $NUM -gt 254 ] do ping -c1 -W1 "172.16.250.$NUM" &> /dev/null if [ $? -eq 0 ];then echo "172.16.150.$NUM is up" COUNT1=$(($count1+1)) else COUNT2=$(($COUNT2+1)) fi NUM=$(($NUM+1)) done echo "total $COUNT1 is up,$COUNT2 is down" unset NUM unset COUNT1 unset COUNT2
5、編寫腳本,打印九九乘法表
#!/bin/bash #Version:1.0 #Create time:2016-08-17 11:07:26 #Description: NUM=1 until [ $NUM -gt 9 ] do for I in `seq $NUM` do echo -ne "${NUM}X$I=$(($NUM*$I))\t" done NUM=$(($NUM+1)) echo done unset NU
6、編寫腳本,利用變量RANDOM生成10個隨機數字,輸出這個10數字,并顯示其中的最大者和最小者
#!/bin/bash #Version:1.0 #Create time:2016-08-17 11:08:42 #Description: let I=1 let MAX=0 let MIN=$RANDOM echo $MIN until [ $I -gt 9 ] do let NUM=$RANDOM echo "$NUM" if [ $NUM -le $MAX ];then if [ $NUM -le $MIN ];then MIN=$NUM fi else MAX=$NUM fi I=$(($I+1)) done echo "the max num is $MAX" echo "the min num is $MIN" unset I unset MAX unset MIN unset NUM
7、編寫腳本,實現打印國際象棋棋盤
#!/bin/bash #Version:1.0 #Create time:2016-08-17 11:10:07 #Description: #算法:行數和列數之和為偶數打印白格,為奇數打印黑格 let I=1 until [ $I -gt 8 ] do for J in `seq 8` do [ $((($I+$J)%2)) -eq 0 ] && echo -ne "\033[47m \033[0m" || echo -ne "\033[40m \033[0m" done I=$(($I+1)) echo done
8、打印等腰三角形
#!/bin/bash #Version:1.0 #Create time:2016-08-17 11:21:00 #Description:打印等腰三角形, #算法:1、第n行打印總行數N-n個空格,2、第n行打印2n-1個*。先打印空格再打印* read -p "how many lines you want? " LINES ! expr $LINES + 0 &> /dev/null && echo "input digitNUM" && exit 100 [ $LINES -le 0 ] && echo "input positive int" && exit 99 let I=1 let B=$LINES-1 until [ $I -gt $LINES ] do for A in `seq $B` do echo -n " " done let B-- for J in `seq $((2*$I-1))` do echo -n "*" done echo let I++ done
9、安裝centos6.7,用centos6.8kernel升級
rpm -ivh kernel-2.6.32-431.el6.x86_64.rpm
二、預習
原創文章,作者:麥德良,如若轉載,請注明出處:http://www.www58058.com/36947
腳本需要我們做的就是多寫,多看優秀的代碼,rpm包管理器常用的選項需要做的就是能熟練允許用,這需要多加聯系。