标签:tar while cpio打包解压. shell脚本for until循环. rpm包管理 循环的特殊用法. select循环菜单
tar
tar -cf 路径+文件名字后续.tar +路径 创建归档压缩
tar cf /testdir/etc.tar /etc/
tar cvf 可以查看解压过程
tar tvf 预览作用
tar xvf 解压文件
tar zcvf /testdir/etc2.tar.gz /etc/ 解压再压缩到指定路径,文件格式
tar jcvf
cpio
复制 从或到文件
cpio 命令是通过重定向的方式将文件进行打包备份,还原恢复的工具,它可以解压以“.cpio”或者".tar"
结尾的文件。
cpio[选项] > 文件名或者设备名
cpio[选项] < 文件名或者设备名
-o 将文件拷贝打包成文件或者将文件输出到设备上
-i 解包,将打包文件解压或将设备上的备份还原到系统
-t 预览,查看文件内容或者输出到设备上的文件内容
-v 显示打包过程中的文件名称。
-d 解包生成目录,在cpio还原时,自动的建立目录
-c 一种较新的存储方式
cpio -ivd < /root/etc.cpio
shell 脚本
循环执行
将某代码段重复运行多次
重复运行多少次:
循环次数事先已知
循环次数事先未知
有进入条件和退出条件
for, while, until
for
for 变量名 in 列表;do
循环体
;done
for NAME [in WORDS ... ] : do COMMANDS :done
循环列表
for id in "$@"
do
echo "the number is $id"
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
continue(中断当次循环)
break (打断之后的循环)
exit(直接退出脚本)
while CONDTIITON1; do
CMD1
...
if CONDITION2; then
continue(break)
fi
CMDn
...
done
创建无限循环
while true; do
循环体
done
until false; do
循环体
Done
软件包管理
程序源代码-->预处理-->编译-->汇编-->链接
Windows与Linux不兼容
(二进制文件的格式都不相同)
java
二进制文件格式为.class
可以通过进行二次编译使二进制文件能够在各种平台上运行。
包管理器
二进制应用程序的组成部分:
二进制文件、库文件、配置文件、帮助文件
程序包管理器:
debian:deb文件, dpkg包管理器
redhat: rpm文件, rpm包管理器
rpm: RedhatPackage Manager
RPM Package Manager
源代码:name-VERSION.tar.gz|bz2|xz
rpm包命名方式:
name-VERSION-release.arch.rpm
例:bash-4.2.46-19.el7.x86_64.rpm
常见的arch:
x86: i386, i486, i586, i686
x86_64: x64, x86_64, amd64powerpc: ppc
跟平台无关:noarch
noarch是兼容版本,32位文件能在64位系统运行,但64位文件不能在32位系统中运行。
包的分类和拆包
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
第三方软件,安装之后要将路径写入库文件夹
才能调进内存中。
包管理器
rpm
程序包管理器:
功能:将编译好的应用程序的各组成文件打包一个或几个程序包文件,从而方便快捷地实现程序包的安装、卸载、查询、升级和校验等管理操作
1、包文件组成(每个包独有)
RPM包内的文件
RPM的元数据,如名称,版本,依赖性,描述等
安装或卸载时运行的脚本
(安装包前要看检查包里面的内容,防止恶意脚本运行。)
2、数据库(公共)
程序包名称及版本
依赖关系(包的依赖性全部在)
功能说明
包安装后生成的各文件路径及校验码信息
(可以对比程序是否发生变化)
管理程序包的方式:
使用包管理器:rpm
使用前端工具:yum
获取程序包的途径:
(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) 自己制作
注意:检查其合法性:来源合法性,程序包的完整性
rpm包的管理
rpm -i 安装
CentOS系统上使用rpm命令管理程序包:
安装、卸载、升级、查询、校验、数据库维护
安装:
rpm {-i|--install} [install-options] PACKAGE_FILE…
-v: verbose
-vv: 更详细地显示内容
-h: 以#显示程序包管理执行进度
rpm -ivh PACKAGE_FILE ...
rpm -ivh
-e 卸载
--test: 测试安装,但不真正执行安装;dry run模式
--nodeps:忽略依赖关系
--replacepkgs| replacefiles
(同一个包,版本一样。覆盖安装 | 版本号,文件名不一样,但里面有重复的文件,覆盖安装。)
--nosignature: 不检查来源合法性
--nodigest:不检查包完整性
--noscipts:不执行程序包脚本片断
%pre: 安装前脚本;--nopre
%post: 安装后脚本;--nopost
%preun: 卸载前脚本;--nopreun
%postun: 卸载后脚本;--nopostun
升级:
rpm -U
rpm -F
upgrade:安装有旧版程序包,则“升级”
如果不存在旧版程序包,则“安装”
freshen:安装有旧版程序包,则“升级”
如果不存在旧版程序包,则不执行升级操作
--oldpackage:降级
--force: 强行升级(强制命令。可以混搭其他指令使用)
注意:
ls kernel-* 查看内核包
内核是安装,rpm -ivh kernel-*. 保留旧内核,安装新内核。可以通过重启开机选择运行的内核版本。
(1) 不要对内核做升级操作;Linux支持多内核版本并存,因此,对直接安装新版本内核
(升级会删除旧的内核版本)
(2) 如果原程序包的配置文件安装后曾被修改,升级时,新版本的提供的同一个配置文件并不会直接覆盖老版本的配置文件,而把新版本的文件重命名(FILENAME.rpmnew)后保留
while
特殊用法
while read line :do
(输入不输入变量都是真$?=0)
while read -p "good morning"hello;do echo $hello ;done (会一直循环访问你)
传一行处理一行
(( ))
C语言风格的(( ))用法
i=10; let i++;echo $i
i=10; ((i++));echo $i
for循环的特殊格式
for((exp1;exp2;exp3))
do
cmd
done
for ((i=1;i<10;i++));
do
echo $i;
done
打印出数字1到9
for循环的特殊格式:
for ((控制变量初始化;条件判断表达式;控制变量的修正表达式))
do
循环体
done
控制变量初始化:仅在运行到循环代码段时执行一次
控制变量的修正表达式:每轮循环结束会先进行控制变量修正运算,而后再做条件判断
select循环与菜单
select variable in list
do
循环体命令
done
select 循环主要用于创建菜单,按数字顺序排列的菜单项将显示在标准错误上,并显示PS3 提示符,等待用户输入
用户输入菜单列表中的某个数字,执行相应的命令
用户输入被保存在内置变量REPLY 中。
select menu in gbjd kr lm;do echo $menun ;done
$menu 可以被 gbjd kr lm 内容替代,可以通过指定使用变量1,2,3使用。
可以实现了一个分支判断
$REPLY 显示的是你输入的内容
PS3=" "
(默认是输入的数值为可选择数值)
select menu
do
caes $menu in
gbjd)
echo" "
;;
lm)
echo" "
;;
kr)
echo" "
;;
*)
echo" "
;;
esac
done
函数function
由若干条shell命令组成的语句块,实现代码重用和模块化编程。
函数也是一段代码,与当前shell并行关系。
函数由两部分组成:函数名和函数体。
语法一:
function f_name{
...函数体...
}
语法二:
function f_name(){
...函数体...
}
语法三:
f_name(){
...函数体...
}
function fun1 (){
echo "this is a fun1"
}
fun1
直接用fun1就等于使用了里面的指令,不等于变量,不需要加$.
set 用来看内存的环境变量,也可以看到在内存的函数。
unset +函数名 可以释放内存中的函数。
函数返回值
函数有两种返回值:
函数的执行结果返回值:
(1) 使用echo或printf命令进行输出
(2) 函数体中调用命令的输出结果
函数的退出状态码:
(1) 默认取决于函数中执行的最后一条命令的退出状态码
(2) 自定义退出状态码,其格式为:
return 从函数中返回,用最后状态命令决定返回值
return 0 无错误返回。
return 1-255 有错误返回
return +数字 可以用echo $? 查询到函数指定的数值
source funs 当前shell运行
. funs 等于在当前目录下打开一个shell。
函数的定义和使用:
可在交互式环境下定义函数
可将函数放在脚本文件中作为它的一部分
可放在只包含函数的单独文件中
调用:函数只有被调用才会执行;
调用:给定函数名
函数名出现的地方,会被自动替换为函数代码
函数的生命周期:被调用时创建,返回时终止
专门找一个文件放函数,
要使用的时候在shell中使用
.函数 或者 source 函数。
(函数本身不用加执行权限)
函数变量
局部变量
local +变量 定义的变量函数内部使用。
变量作用域:
环境变量:当前shell和子shell有效
本地变量:只在当前shell进程有效,为执行脚本会启动专用子shell进程;因此,本地变量的作用范围是当前shell脚本程序文件,包括脚本中的函数。
局部变量:函数的生命周期;函数结束时变量被自动销毁
注意:如果函数中有局部变量,如果其名称同本地变量,使用局部变量。
在函数中定义局部变量的方法
local NAME=VALUE
fun (){ let i++;echo "$i";fun; }
无限fun
pstree查看父子进程
包的查询
rpm -q 查询
-a: 所有包
-f: 查看指定的文件由哪个程序包安装生成
rpm -qf
即使删除了,数据库还有记录,能查询。
rpm -ql 可以查询包里面的文件。
l+包名。
-p rpmfile:针对尚未安装的程序包文件做查询操作;
rpm -qpl /root/tree.rpm
表示查询还没有安装包里面文件查询,要配合p,p+文件名。
--whatprovidesCAPABILITY:查询指定的CAPABILITY由哪个包所提供
CAPABILITY:能力 (关键字作用)
rpm -q --whatprovides bash
查询那个包提供了bash能力
--whatrequiresCAPABILITY:查询指定的CAPABILITY被哪个包所依赖
rpm -q --whatrequires bash
查询哪个包依赖bash能力
--changelog:查询rpm包的changelog
-c: 查询程序的配置文件
-d: 查询程序的文档
-i: information 查询包的具体信息
-l: 查看指定的程序包安装后生成的所有文件;
--scripts:程序包自带的脚本片断
-R: 查询指定的程序包所依赖的CAPABILITY;
rpm -qR bash 查看bash依赖哪些包
--provides: 列出指定程序包所提供的CAPABILITY
rpm -q --provides
rpm2cpio 包文件|cpio–itv预览包内文件
rpm2cpio tree.rpm |cpio -tv 预览
rpm2cpio 包文件|cpio–id “*.conf”释放包内文件
rpm2cpio tree.rpm |cpio -idv +所选指定文件的路径
解压缩指定包内的文件
yum是建立在rpm之上
rpm -e +包名字 卸载
rpm -e kernel 卸载内核会卸载不成功
--allmatches 全部卸载
--nodeps 卸载不考虑依耐性
--noscripts 卸载不运行脚本
--notriggers 卸载不触发
--test 不真实卸载
包检验
rpm --import /etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7
导入公钥
可以通过公钥检测包的签名
rpm -V tree 检查包跟原来的差别
rpm -K|checksigrpmfile检查包的完整性和签名
rpm -K tree.rpm 检查包是否被破坏
检查的前提是要先导入钥匙
包来源合法性验正及完整性验正:
完整性验正:SHA256
来源合法性验正:RSA
公钥加密:
对称加密:加密、解密使用同一密钥;
非对称加密:密钥是成对儿的
public key: 公钥,公开所有人
secret key: 私钥, 不能公开
rpm -V tree 检查包跟原来的差别
S file Size differs
M Mode differs (includes permissions and file type)
5 digest (formerly MD5 sum) differs
D Device major/minor number mismatch
L readLink(2) path mismatch
U User ownership differs
G Group ownership differs
T mTimediffers
P capabilities differ
rpm数据库
/var/lib/rpm
initdb: 初始化
如果事先不存在数据库,则新建之
否则,不执行任何操作
rebuilddb:重建
无论当前存在与否,直接重新创建数据库
yum
解决包的依赖性
YUM:Yellowdog Update Modifier,rpm的前端程序,用来解决软件包相关依赖性,可以在多个库之间点位软件包,up2date的代替工具。
yum的仓库
yum repository: yum repo,存储了众多rpm包,以及包的相关的元数据文件(放置于特定目录repodata下)
路径写父目录
文件服务器:
ftp://
http://
file:///
文件共享yum的仓库
/etc/yum.conf
/etc/yum.repos.d
repo配置文件
vim base.repo (必须文件repo结尾)
[base] (仓库名字自定义。但是5版本前的必须使用bash名字,不然会出错)
name=centos 7 (自定义)
baseurl=http://10.1.0.1/cobbler/ks_mirror/7/ (网络上存有的仓库路径,路径写到父目录就可以使用)
gpgcheck=1 (是否使用钥匙鉴定(1是0否))
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-Centos-7 (本机自带的公共钥匙库路径)
enabled=1 (是否启用yum仓库)
yum repolist 查看显示资源库的配置
yum install tree 装tree包
yum list |grep tree 查看包的出处
yum remove +包名卸载
yum客户端配置文件:
/etc/yum.conf:为所有仓库提供公共配置
/etc/yum.repos.d/*.repo:为仓库的指向提供配置
yum-config-manager --add-repo= http://172.16.0.1/cobbler/ks_mirror/CentOS-X-x86_64/
自动生成仓库
yum-config-manager --disable “仓库名" 禁用仓库
yum-config-manager --enable “仓库名” 启用仓库
cat /var/log/yum.log 查看yum的日志
显示仓库列表:
repolist[all|enabled|disabled]
显示程序包:
list
# yum list [all | glob_exp1] [glob_exp2] [...]
# yum list {available|installed|updates} [glob_exp1] [...]
安装程序包:
install package1 [package2] [...]
reinstall package1 [package2] [...] (重新安装)
升级程序包:
update [package1] [package2] [...]
downgrade package1 [package2] [...] (降级)
检查可用升级:
check-update
卸载程序包:
remove | erase package1 [package2] [...]
info [...]可安装和可更新的RPM包 信息
查看程序包information。
provides | whatprovidesfeature1 [feature2] [...]
查看指定的特性(可以是某文件)是由哪个程序包所提供。
清理本地缓存:
clean [ packages | metadata | expire-cache | rpmdb| plugins | all ]
yum clean all 清理所有缓存
(用来清理旧的错误数据)
构建缓存:
makecache
yum makecache
yum search tree 搜索关键字
yum history 查看yum历史
用循环实现国际象棋棋盘
9*9乘法表
本文出自 “zczx_展鸿” 博客,请务必保留此出处http://swzczx.blog.51cto.com/11767585/1840851
tar ,cpio打包解压. shell脚本for,while,until循环. rpm包管理,select循环菜单,函数function,yum
标签:tar while cpio打包解压. shell脚本for until循环. rpm包管理 循环的特殊用法. select循环菜单
原文地址:http://swzczx.blog.51cto.com/11767585/1840851