shell 腳本 之循環 for while until 和 軟件包的管理 【上】
循環執行
將某代碼段重復運行多次
重復運行多少次:
循環次數事先已知
循環次數事先未知
有進入條件和退出條件 ?
for, while, until
for 變量名 in 列表;do
循環體
done ?
執行機制: 依次將列表中的元素賦值給“變量名”; 每次賦值后即執 行一次循環體; 直到列表中的元素耗盡,循環結束
列表生成方式:
(1) 直接給出列表
(2) 整數列表: (a) {start..end} (b) $(seq [start [step]] end)
(3) 返回列表的命令 $(COMMAND)
(4) 使用glob,如:*.sh
(5) 變量引用; $@, $*
while循環 ?
while CONDITION; do
循環體
done ?
CONDITION:循環控制條件;進入循環之前,先做一次判 斷;每一次循環之后會再次做判斷;條件為“true”,則執行 一次循環;直到條件測試狀態為“false”終止循環 ?
因此:CONDTION一般應該有循環控制變量;而此變量的值 會在循環體不斷地被修正 ?
進入條件:CONDITION為true; ?
退出條件:CONDITION為false
until循環 ?until CONDITION; do
循環體 ?
done
? 進入條件: CONDITION 為false ?
退出條件: CONDITION 為true
循環控制語句 之 continue and break
循環控制語句continue
? 用于循環體中 ?
continue [N]:提前結束第N層的本輪循環,而直接進入下一 輪判斷;最內層為第1層
while CONDTIITON1; do
CMD1
…
if CONDITION2; then
continue
fi
CMDn
…
done
循環控制語句break
? 用于循環體中 ?
break [N]:提前結束第N層循環,最內層為第1層
while CONDTIITON1; do
CMD1
…
if CONDITION2; then
break
fi CMDn
…
done
創建無限循環
while true; do
循環體 ?
done
?
until false; do
循環體 ?
Done
解壓歸檔 之 tar
tar [OPTION]…
(1) 創建歸檔
tar -c -f /PATH/TO/SOMEFILE.tar FILE…
tar cf /PATH/TO/SOMEFILE.tar FILE…
(2) 查看歸檔文件中的文件列表
tar -t -f /PATH/TO/SOMEFILE.tar
(3) 展開歸檔
tar -x -f /PATH/TO/SOMEFILE.tar tar -x -f /PATH/TO/SOMEFILE.tar -C /PATH/ ?
結合壓縮工具實現:歸檔并壓縮 -j: bzip2, -z: gzip, -J: xz
cpio 復制 從或到文件 ?
cpio命令是通過重定向的方式將文件進行打包備份,還原恢復 的工具,它可以解壓以“.cpio”或者“.tar”結尾的文件。 ?
cpio [選項] > 文件名或者設備名 ?
cpio [選項] < 文件名或者設備名 ?
選項
-o 將文件拷貝打包成文件或者將文件輸出到設備上
-i 解包,將打包文件解壓或將設備上的備份還原到系統
-t 預覽,查看文件內容或者輸出到設備上的文件內容
-v 顯示打包過程中的文件名稱。
-d 解包生成目錄,在cpio還原時,自動的建立目錄
-c 一種較新的存儲方式
例如
將etc目錄備份:
find ./etc -print |cpio -ov >etc.cpio ?
內容預覽
cpio –tv < etc.cpio ?
要解包文件
cpio –iv <etc.cpio
cpio –idv < etc.cpio
軟件運行環境
?API:Application Programming Interface
POSIX:Portable OS ?
程序源代碼 –> 預處理 –> 編譯 –> 匯編 –> 鏈接
靜態編譯:
共享編譯:.so ?
ABI:Application Binary Interface
Windows與Linux不兼容
ELF(Executable and Linkable Format)
PE(Portable Executable)
庫級別的虛擬化:
Linux: WINE
Windows: Cywin
包管理器
二進制應用程序的組成部分:
二進制文件、庫文件、配置文件、幫助文件 ?
程序包管理器:
debian:deb文件, dpkg包管理器
redhat: rpm文件, rpm包管理器
rpm: Redhat Package Manager
RPM Package Manager
包命名
rpm包命名方式:
name-VERSION-release.arch.rpm
VERSION:
major.
minor.
release
release:release.OS
常見的arch: x86: i386, i486, i586, i686 x86_64: x64, x86_64, amd64
powerpc: ppc
跟平臺無關:noarch
包命名和工具
包:分類和拆包 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包管理器前端管理工具
庫文件
查看二進制程序所依賴的庫文件:
ldd /PATH/TO/BINARY_FILE ?
管理及查看本機裝載的庫文件:
ldconfig
/sbin/ldconfig -p: 顯示本機已經緩存的所有可用庫文件
名及文件路徑映射關系
配置文件:/etc/ld.so.conf, /etc/ld.so.conf.d/*.conf
緩存文件:/etc/ld.so.cache
包管理器
? 程序包管理器: 功能:將編譯好的應用程序的各組成文件打包一個或幾個 程序包文件,從而方便快捷地實現程序包的安裝、卸載、查詢、 升級和校驗等管理操作 ?
1、包文件組成 (每個包獨有)
RPM包內的文件
RPM的元數據,如名稱,版本,依賴性,描述等
安裝或卸載時運行的腳本 ?
2、數據庫(公共)
程序包名稱及版本
依賴關系
功能說明
包安裝后生成的各文件路徑及校驗碼信息
管理程序包的方式:
使用包管理器:
rpm
使用前端工具:
yum, dnf
rpm包管理 ?
CentOS系統上使用rpm命令管理程序包:
安裝、卸載、升級、查詢、校驗、數據庫維護
安裝:
rpm {-i|–install} [install-options] PACKAGE_FILE…
-v: verbose
-vv:
-h: 以#顯示程序包管理執行進度
rpm -ivh PACKAGE_FILE …
rpm包安裝 ?[install-options]
–test: 測試安裝,但不真正執行安裝;dry run模式
–nodeps:忽略依賴關系
–replacepkgs | replacefiles
–nosignature: 不檢查來源合法性
–nodigest:不檢查包完整性
–noscipts:不執行程序包腳本片斷
%pre: 安裝前腳本; –nopre
%post: 安裝后腳本; –nopost
%preun: 卸載前腳本; –nopreun
%postun: 卸載后腳本;–nopostun
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: 強行升級
升級注意事項
? (1) 不要對內核做升級操作;Linux支持多內核版本并存,因此 ,對直接安裝新版本內核
(2) 如果原程序包的配置文件安裝后曾被修改,升級時,新版本
的提供的同一個配置文件并不會直接覆蓋老版本的配置文件,而 把新版本的文件重命名(FILENAME.rpmnew)后保留
1、求100以內所有正整數之和
#!/bin/bash
read -p "first number:" a
read -p "second number:" b
[ $a -ge $b ] && echo "sum is `seq -s+ $b $a | bc`" || echo "sum is `seq -s+ $a $b | bc`"
[root@localhost bin]# bash shushu.sh
first name is a:2
second name is b:100
sum= 5049?
2、通過ping命令探測172.16.250.1-254范圍內的所有主機 的在線狀態,統計在線主機和離線主機各多少。
#!/bin/bash
read -p "please input a IPv4:" ip
up=0 down=0
ipv4=`echo $ip|cut -d. -f1-3`
for ipv in {0..255} ;do
IP="$ipv4"."$ipv"
ping "$IP" -c 1 -W 1 &>/dev/null && echo "The Up IPv4 is:$IP" && let up+=1 &>/dev/null || let down+=1 &>/dev/null
done
echo "IPv4($ipv4.1-255) up is :$up"
echo "IPv4($ipv4.1-255) down is :$down"
?
3、打印九九乘法表
for i in {1..9};do
for j in $(seq 1 $i) ;do
echo -ne "${j}x${i}=$[i*j]\t"
done
echo
done
電腦演示
[root@localhost bin]# vim 999.sh
[root@localhost bin]# bash 999.sh
1×1=1
1×2=2 2×2=4
1×3=3 2×3=6 3×3=9
1×4=4 2×4=8 3×4=12 4×4=16
1×5=5 2×5=10 3×5=15 4×5=20 5×5=25
1×6=6 2×6=12 3×6=18 4×6=24 5×6=30 6×6=36
1×7=7 2×7=14 3×7=21 4×7=28 5×7=35 6×7=42 7×7=49
1×8=8 2×8=16 3×8=24 4×8=32 5×8=40 6×8=48 7×8=56 8×8=64
1×9=9 2×9=18 3×9=27 4×9=36 5×9=45 6×9=54 7×9=63 8×9=72 9×9=81 ?
4、利用變量RANDOM生成10個隨機數字,輸出這個10數字 ,并顯示其中的最大者和最小者
#!/bin/bash
declare -i max=0
declare -i min=0
for i in {1..10} ;do
tmp=$RANDOM
[ $i -eq 1 ] && min=$tmp
if [ $i -le 9 ] ;then
echo -n "$tmp"
else
echo "$tmp"
fi
if [ $tmp -gt $max ] ;then
max=$tmp
elif [$tmp -lt $min ] ;then
min=$tmp
fi
done
echo "the max random is $max"
echo "the min random is $min"
?
5、打印國際象棋棋盤
1#!
2 #
3 for i in $(seq 1 8);do
4 for j in $(seq 1 8);do
5 [ $[i%2-$j%2] -eq 0 ] && echo -ne "\033[41m \033[0m" || echo -ne "\033[47 m \033[0m"
6 let j++
7 done
8 echo ""
9 let i++
10 done
11
原創文章,作者:a1215276209,如若轉載,請注明出處:http://www.www58058.com/36843