一、循环语句: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.178linux.com/37327