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.178linux.com/36843