一、循環語句:for, while, until
循環執行:
將某代碼段重復運行多次
重復運行多少次:
循環次數事先已知
循環次數事先未知
有進入條件和退出條件
1.for……do……done
for 變量 in 列表 ; do
循環體
done
執行機制:
依次將列表中的元素賦值給“變量名”; 每次賦值后即執行一次循環體; 直到列表中的元素耗盡,循環結束
列表生成方式:
(1) 直接給出列表
(2) 整數列表
(a) {start..end}
(b) $(seq[start [step]] end)
(3) 返回列表的命令:$(COMMAND)
(4) 使用glob,如:*.sh
(5) 變量引用:$@, $*
2.while……do……done
while CONDITION ; do
循環體
done
CONDITION:循環控制條件
進入循環之前,先做一次判斷;
每一次循環之后會再次做判斷;
條件為“true”,則執行一次循環;
直到條件測試狀態為“false”終止循環.
因此:
CONDTION一般應該有循環控制變量;
而此變量的值會在循環體不斷地被修正;
進入條件:CONDITION為true;
退出條件:CONDITION為false.
3.until……do……done
until CONDITION ; do
循環體
done
CONDITION:循環控制條件
進入循環之前,先做一次判斷;
每一次循環之后會再次做判斷;
條件為“false”,則執行一次循環;
直到條件測試狀態為“true”終止循環.
因此:
CONDTION一般應該有循環控制變量;
而此變量的值會在循環體不斷地被修正;
進入條件:CONDITION 為false
退出條件:CONDITION 為true
4.循環控制語句:continue, break
(1).continue [N]:提前結束第N層的本輪循環,而直接進入下一輪判斷;最內層為第1層
while CONDTIITON1 ; do
CMD1
…
if CONDITION2 ; then
continue
fi
CMDn
…
done
(2).break [N]:提前結束第N層循環,最內層為第1層
while CONDTIITON1; do
CMD1
…
if CONDITION2; then
break
fi
CMDn
…
done
5.創建無限循環
while true ; do
循環體
done
until false ; do
循環體
Done
二、程序包管理:rpm
1.程序基礎
API:Application Programming Interface
POSIX:Portable OS
源代碼編譯:程序源代碼–> 預處理–> 編譯–> 匯編–> 鏈接
靜態編譯:.a
共享編譯:.so
ABI:Application Binary Interface
Windows與Linux不兼容
ELF(Executable and Linkable Format)
PE(Portable Executable)
庫級別的虛擬化:
Linux: WINE
Windows: Cywin
系統級開發:C, C++
應用級開發:java, delphi, Python, go, php, perl, ruby
2.包管理器
二進制應用程序的組成部分:二進制文件、庫文件、配置文件、幫助文件
程序包管理器分類:
debian:deb文件, dpkg包管理器
redhat: rpm文件, rpm包管理器
rpm: RPM Package Manager (Redhat Package Manager)
3.程序包命名
源代碼: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
常見的arch:
x86: i386, i486, i586, i686
x86_64: x64, x86_64, amd64powerpc: ppc
跟平臺無關:noarch
4.程序包:分類和拆包
Application-VERSION-ARCH.rpm: 主包
Application-devel-VERSION-ARCH.rpm開發子包
Application-utils-VERSION-ARHC.rpm其它子包
Application-libs-VERSION-ARHC.rpm其它子包
程序包之間:可能存在依賴關系,甚至循環依賴
解決依賴包管理工具:
yum:rpm包管理器的前端工具
apt-get:deb包管理器前端工具
zypper: suse上的rpm前端管理工具
dnf: Fedora 18+ rpm包管理器前端管理工具
5.庫文件
ldd /PATH/TO/BINARY_FILE :查看二進制程序所依賴的庫文件:
ldconfig -p : 顯示本機已經緩存的所有可用庫文件名及文件路徑映射關系
配置文件:/etc/ld.so.conf, /etc/ld.so.conf.d/*.conf
緩存文件:/etc/ld.so.cache
6.程序包管理器:將編譯好的應用程序的各組成文件打包一個或幾個程序包文件,從而方便快捷地實現程序包的安裝、卸載、查詢、升級和校驗等管理操作
包文件組成(每個包獨有):RPM包內的文件;RPM的元數據,如名稱,版本,依賴性,描述等;安裝或卸載時運行的腳本
數據庫(公共):程序包名稱及版本;依賴關系;功能說明;包安裝后生成的各文件路徑及校驗碼信息
管理程序包的方式:
使用包管理器:rpm
使用前端工具:yum, dnf
獲取程序包的途徑:
(1) 系統發版的光盤或官方的服務器;
CentOS鏡像:https://www.centos.org/download/
國內鏡像站點:
http://mirrors.aliyun.com
http://mirrors.sohu.com
http://mirrors.163.com
(2) 項目官方站點
(3) 第三方組織:
Fedora-EPEL: Extra Packages for Enterprise Linux
Rpmforge:RHEL推薦,包很全
搜索引擎:
http://pkgs.org
http://rpmfind.net
http://rpm.pbone.net
https://sourceforge.net/
(4) 自己制作
注意:檢查其合法性:來源合法性,程序包的完整性
7.rpm包管理
CentOS系統上使用rpm命令管理程序包:安裝、卸載、升級、查詢、校驗、數據庫維護
(1).安裝:
rpm {-i|–install} [install-options] PACKAGE_FILE…
-v: 查看安裝過程中的詳細信息
-vv:查看安裝過程中更詳細信息
-h: 以#顯示程序包管理執行進度
常用選項:rpm -ivh PACKAGE_FILE …
–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:安裝有舊版程序包,則“升級”;如果不存在舊版程序包,則不執行升級操作
–oldpackage:降級
–force: 強行升級
常用選項:rpm -Uvh PACKAGE_FILE …
常用選項:rpm -Fvh PACKAGE_FILE …
注意:
(1)不要對內核做升級操作;Linux支持多內核版本并存,因此,對直接安裝新版本內核
(2)果原程序包的配置文件安裝后曾被修改,升級時,新版本的提供的同一個配置文件并不會直接覆蓋老版本的配置文件,而把新版本的文件重命名(FILENAME.rpmnew)后保留
用for實現
1、判斷/var/目錄下所有文件的類型
#!/bin/bash #date:08/16/16 read -p "Please input a directory:" dir test ! -d $dir && echo "Sorry,it is not a directory" && exit echo "$dir" | grep -o "\/$" > /dev/null || dir=$dir/ echo for file in `ls -A $dir` ; do file $dir$file done
2、添加10個用戶user1-user10,密碼同用戶名
#!/bin/bash #date:08/16/16 for id in `echo {1..10}` ; do useradd user$id ; echo "user$id:user$id" | chpasswd done
3、/etc/rc.d/rc3.d目錄下分別有多個以K開頭和以S開頭的文件;分別讀取每個文件,以K開頭的文件輸出為文件加stop,以S開頭
的文件輸出為文件名加start;“K34filename stop”,“S66filename start”
#!/bin/bash #date:08/16/16 for file in `ls -A /etc/rc.d/rc3.d` ; do case $file in K*) echo "$file stop" ;; S*) echo "$file start" ;; *) echo "$file is not begin with K or S" esac done
4、寫一個腳本,提示輸入正整數n的值,計算1+2+3+…n的總和 #!/bin/bash
#date:08/16/16 read -p "Please input a integer:" int if expr $int + 0 > /dev/null ; then for num in `seq $int` ; do num=$[num+int] done echo "The sum is $num" else echo "$int is not a integer" fi
5、寫一個腳本,提示請輸入網絡地址,如192.168.0.0,判斷輸入的網段中主機在線狀態 #!/bin/bash
#date:08/17/16 read -p "Please input a IP addr:" netip if echo "$netip" | egrep -q '\<(1?[0-9]{0,2}|2[0-4][0-9]|25[0-5])(\.(1?[0-9]{0,2}|2[0-4][0-9]|25[0-5])){3}\>' ; then firstnum=`echo "netip" | cut -d "." -f 1` if [ $firstnum -gt 0 -a $firstnum -lt 127 ] ; then for tail in {0..255}.{0..255}.{0..255} ; do ping -c 1 -W 1 $firstnum.$tail &> /dev/null && echo "$firstnum.$tail is up" || echo "$firstnum.$tail is down" done elif [ $firstnum -ge 128 -a $firstnum -le 191 ] ; then head=`echo "$netip" | cut -d "." -f 1,2` for tail in {0..255}.{0..255} ; do ping -c 1 -W 1 $head.$tail &> /dev/null && echo "$head.$tail is up" || echo "$head.$tail is down" done elif [ $firstnum -ge 192 -a $firstnum -le 233 ] ; then head=`echo "$netip" | cut -d "." -f 1,2,3` for tail in {0..255} ; do ping -c 1 -W 1 $head.$tail &> /dev/null && echo "$head.$tail is up" || echo "$head.$tail is down" done else echo "This ip can not connect internet" fi else echo "This is a illegal IP" fi
6、打印九九乘法表
#!/bin/bash #date:08/17/16 for i in {1..9} ; do for j in `seq $i` ; do echo -ne "$j*$i=$[i*j]\t" done echo done
用while實現
1、求100以內所有正整數之和
#!/bin/bash #date:08/17/16 i=0 while [ $i -le 100 ] ; do j=$[j+i] ; let i++ done echo $j
2、通過ping命令探測172.16.250.1-254范圍內的所有主機的在線狀態,統計在線主機和離線主機各多少。
#!/bin/bash #date:08/17/16 i=1 while [ $i -le 254 ] ; do if (ping -c 1 -W 1 172.16.250.$i &> /dev/null) ; then echo "172.16.250.$i is up" ; let up++ else echo "172.16.250.$i is down" ; let down++ fi let i++ done echo "The sum of up is $up" echo "The sum of down is $down"
3、打印九九乘法表
#!/bin/bash #date:08/17/16 i=1 while [ $i -le 9 ] ; do j=1 while [ $j -le $i ] ; do echo -ne "$j*$i=$[i*j]\t" ; let j++ done echo let i++ done
4、利用變量RANDOM生成10個隨機數字,輸出這個10數字,并顯示其中的最大者和最小者
#!/bin/bash #date:08/17/16 num=`echo $[RANDOM]` echo=$num max=$num min=$num i=1 while [ $i -le 9 ] ; do num=`echo $[RANDOM]` echo $num [ $num -gt $max ] && max=$num [ $num -lt $min ] && min=$num let i++ done echo "max $max" echo "min $min"
5、打印國際象棋棋盤
#!/bin/bash #date:08/17/16 i=1 while [ $i -le 8 ] ; do j=1 while [ $j -le 8 ] ; do sum=$[$i+$j] rem=$[$sum%2] if [ $rem -eq 0 ] ; then echo -ne "\033[47m \033[0m" else echo -ne "\033[41m \033[0m" fi j=$[$j+1] done i=$[$i+1] echo done
用until實現
1、求100以內所有正整數之和
#!/bin/bash #date:08/17/16 i=0 until [ $i -gt 100 ] ; do j=$[j+i] ; let i++ done echo $j
2、通過ping命令探測172.16.250.1-254范圍內的所有主機的在線狀態,統計在線主機和離線主機各多少。
#!/bin/bash #date:08/17/16 i=1 until [ $i -gt 254 ] ; do if (ping -c 1 -W 1 172.16.250.$i &> /dev/null) ; then echo "172.16.250.$i is up" ; let up++ else echo "172.16.250.$i is down" ; let down++ fi let i++ done echo "The sum of up is $up" echo "The sum of down is $down"
3、打印九九乘法表
#!/bin/bash #date:08/17/16 i=1 until [ $i -gt 9 ] ; do j=1 until [ $j -gt $i ] ; do echo -ne "$j*$i=$[i*j]\t" ; let j++ done echo let i++ done
4、利用變量RANDOM生成10個隨機數字,輸出這個10數字,并顯示其中的最大者和最小者
#!/bin/bash #date:08/17/16 num=`echo $[RANDOM]` echo=$num max=$num min=$num i=1 until [ $i -gt 9 ] ; do num=`echo $[RANDOM]` echo $num [ $num -gt $max ] && max=$num [ $num -lt $min ] && min=$num let i++ done echo "max $max" echo "min $min"
5、打印國際象棋棋盤
#!/bin/bash #date:08/17/16 i=1 until [ $i -gt 8 ] ; do j=1 until [ $j -gt 8 ] ; do sum=$[$i+$j] rem=$[sum%2] if [ $rem -eq 0 ] ; then echo -ne "\033[47m \033[0m" else echo -ne "\033[41m \033[0m" fi j=$((j+1)) done i=$((i+1)) echo done
6、每隔3秒鐘到系統上獲取已經登錄的用戶的信息;如果發現用戶hacker登錄,則將登錄時間和主機記錄于日志/var/log/login.log中,并提示該用戶退出系統。
#!/bin/bash #date:08/17/16 until false ; do if who | grep -q "^hacker\>" ; then break fi sleep 3 done echo "`date +%F +%T` hacker logged on" >> /var/log/login.log ##!/bin/bash # #until who | grep -q "^hacker\>" ; do # sleep 3 #done #echo "`date +%F +%T` hacker logged on" >> /var/log/login.log
7、隨機生成10以內的數字,實現猜字游戲,提示比較大或小,相等則退出。
#!/bin/bash r=$[RANDOM%10] n=11 until [ $n -eq $r ] ; do read -p "please inout a numper (0-9) " n if [ $n -eq $r ] ; then echo "it is right" elif [ $n -gt $r ] ; then echo "it is great" else [ $n -lt $r ] echo "it is less" fi done
8、打印等腰三角形
#!/bin/bash read -p "number:" n for ((i=0;i<=$n;i++)) ; do for ((j=$n;j>i;j--)) ; do echo -n " " done for((j=0;j<2*i-1;j++)) echo -n "*" done echo done
原創文章,作者:anonymous,如若轉載,請注明出處:http://www.www58058.com/37327