包管理器

shell
script
 是一个程序化脚本,使用shell语法跟linux命令完成的一个程序。

一、函数

程序包管理器:

注意事项:

1、简介

功能:将编译好的应用程序的各组成文件打包一个或几个程序包文件,从而

  文件开头: #!/bin/bash

Shell函数类似于Shell脚本,里面存放了一系列的指令

方便快捷地实现程序包的安装、卸载、查询、升级和校验等管理操作

  文本以enter符号作为开始执行该行语句,用跳脱符
\enter使命令接着下一行写

不过,Shell的函数存在于内存,而不是硬盘文件,所以速度很快

包文件组成 (每个包独有)

  # 号作为批注行

另外,Shell还能对函数进行预处理,所以函数的启动比脚本更快

RPM包内的文件

执行脚本:

2、定义

RPM的元数据,如名称,版本,依赖性,描述等

  首先赋予执行权限:chmod +x filename.sh

function 函数名() {

安装或卸载时运行的脚本

  绝对路径执行:/home/../filename.sh

语句

数据库(公共):/var/lib/rpm

  相对路径执行:./filename.sh

[return]

程序包名称及版本

  将filename.sh放在path目录下,直接执行filename.sh

}

依赖关系

  借用bash执行:bash filename.sh 或者 sh filename.sh

关键字function表示定义一个函数,可以省略,其后是函数名,有时函数名后可以跟一个括号

功能说明

常用操作:

符号“{”表示函数执行命令的入口,该符号也可以在函数名那一行,“}”表示函数体的结束,两个大括号之间是函数体

包安装后生成的各文件路径及校验码信息

  输出:echo
[-ne] 字符串 【说明 -n字符串不自动换行, -e 对一些字符做特殊处理

语句部分可以是任意的Shell命令,也可以调用其他的函数

 

    如: \a 发出警告声
         \b 删除前一个字符
            \c 最后不加上换行符号
            \f 换行但光标仍旧停留在原来的位置
            \n 换行且光标移至行首
            \r 光标移至行首,但不换行
            \t 插入tab
            \v 与\f相同
            \\ 插入\字符

在函数中使用
exit命令,可以退出整个脚本,通常情况,函数结束之后会返回调用函数的部分继续执行

程序包的来源

  退出程序: exit n 【说明 n位数字,常见的为0,可以使用$? 获取这个n值。

可以使用 break 语句来中断函数的执行

管理程序包的方式:

  获取屏幕输入信息: read -p 字符串 变量名 【说明 将字符串赋给变量。

函数的定义可以放到 .bash_profile
文件中,也可以放到使用函数的脚本中,还可以直接放到命令行中

使用包管理器:rpm

  显示日期:$(date +%Y%m%d) 将当前日期格式化为年月日

函数可进行嵌套

使用前端工具:yum, dnf

  条件判断:test

可使用内部的unset命令删除函数。一旦用户注销,Shell将不再保持这些函数

获取程序包的途径:

    test -e /filename && echo “exist” || echo “Not exist”

3、函数调用

(1) 系统发版的光盘或官方的服务器;

    文件或目录类型判断:

3.1、命令行调用

CentOS镜像:

       -e 文件或目录存在

# function show(){ –定义函数 show

       -f  存在且为文件

> echo “hello,you are calling the function”

         -d 存在且为目录

> }

    文件或目录权限判断:

# function display() { –定义函数 display

         -r 文件或目录可读

> echo “you display”

(2) 项目官方站点

       -w 文件或目录可写

> }

(3) 第三方组织:

       -x 文件或目录可执行

# declare -f –显示定义的函数清单

Fedora-EPEL:

       -s 文件或目录存在且为非空

# declare -F –显示定义的函数名清单

Extra Packages for Enterprise Linux

    文件间比较:

# show –命令调用函数 show

Rpmforge:RHEL推荐,包很全

       -nt (newer than) 【test file1 -nt file2】

# unset -f show –删除 show 函数

搜索引擎:

       -ot(older than)

3.2、脚本调用

          -ef 相同

# vim test.sh

     两整数间比较:

#!/bin/bash

       -eq 相等 【test n1 -eq n2】

function show() {         –定义函数

       -ne 不相等

echo “hello shell,i am $1”

(4) 自己制作

       -gt 大于

}

注意:第三方包建议要检查其合法性

       -lt 小于

show george –调用函数,george 为传递参数

来源合法性,程序包的完整性

       -ge 大于等于

4、参数传递

 

       -le 小于等于

函数可以通过位置变量传递参数。例如:

rpm包管理

    字符串判断:

函数名 参数1 参数2 参数3 参数4

(1):CentOS系统上使用rpm命令管理程序包:

       test -z string 字符串为空

当函数执行时,$1 对应
参数1,其他依次类推

安装、卸载、升级、查询、校验、数据库维护

       test -n string 字符串非空 【-n可省】

5、返回值

安装:

       test str1 == str2

函数中的关键字“return”可以放到函数体的任意位置,通常用于返回某些值

rpm {-i|–install} [install-options]
PACKAGE_FILE…

       test str1 != str2

Shell在执行到return之后,就停止往下执行,返回到主程序的调用行

-v: verbose

    多条件判断:

return的返回值只能是0~256之间的一个整数,返回值将保存到变量“$?”中

-vv:

       test -r file -a -x file 文件file 同时 拥有 r 和 x
权限 【-a -o !】

# vim test.sh

-h: 以#显示程序包管理执行进度

  条件判断 [   ]

#!/bin/bash

rpm -ivh PACKAGE_FILE ..

    eg:[ “test“ == “test“ ],【注意空格键,加单双引号】

function abc() {

 

  shell 自带变量

  RESULT=$(expr $1 \% 2)

 

    sh filename.sh op1 op2
op3 ,在filename文本中以$0 表示filename,$1 表示op1,$2 表示op2,$3 表示op3,$# 表示参数个数,$@ 表示“$1”“$2”“$3”,$*
表示“$1 $2 $3”

  if [ “$RESULT” -ne “0” ];then

rpm包安装

  shift 使命令参数变量号偏移

  return 1

-i 安装

    假如sh filename op1 op2 op3 op4 在sh文本中

  else

–test 仅测试,不安装

      echo $1   # 显示op1

  return 0

–nodeps 忽略依赖性

        shift         #偏移一位

  fi

–replacepkgs
重复安装已安装过的包,文件覆盖

        echo $1   #显示op2

}

–replacefiles
将要安装包的部分文件与其他已安装的包文件冲突,可继续安装

      shift 2      #偏移2位

echo “Please enter a number who can devide by 2”

–noscripts:不执行程序包脚本

      echo $1   #显示op4

read N

%pre: 安装前脚本; –nopre

  条件判断语句

abc $N

%post: 安装后脚本; –nopost

    if [ 条件表达式 ] ; then

case $? in

%preun: 卸载前脚本; –nopreun

      执行语句;

0)

%postun: 卸载后脚本; –nopostun

    elif [ 条件表达式 ]; then

   echo “yes ,it is”

–oldpackage 已装新的,再装旧的

      执行语句

  ;;

–force 等同于–replacepkgs
–replacefiles –oldpackage

    fi

1)

-U 更新
如果装的有旧的,则升级,如果未装旧的,则安装新的。

  case 语句

  echo “no ,it isn’t”

-F 更新
如果装的有旧的,则升级,如果未装旧的,不安装新的。

    case $变量名 in

  ;;

 

      ”第一种变量”)

esac

-v 详细信息

        操作;;

6、函数的载入

-vv 更详细信息 *

      ”第二种变量”)

如果函数在另外一个文件中,如 show 函数写在了 function.sh
里面了,我们就可以用 source 命令

-h 显示进度

        操作;;

# vim function.sh

-ivh 安装并详细显示进度 ***

      *)    #不是第一种和第二种的

#!/bin/bash

-q 查询

        操作;;

function show() {

-qa 查询安装的所有包

    esac

  echo “hello world”

rpm -qa scr*

  循环

}

rpm -qa |grep ^scr

    1.while [ 条件表达式 ]                    2.util [ 条件表达式
]                      3.for var in con1 con2
con3 【可能的有限的值】                   

# vim test.sh

-qf
查询指定的文件由哪一个rpm包提供(文件用路径表示)

    do  # 循环开始         
do                                                 
do                         

#!/bin/bash

-qp 指定未安装的rpm包

      程序段             程序段                                      程序段                       

source function.sh

-q –provides 软件包名
查看指定的软件包提供了哪些能力

    done  # 循环结束        done            
done      

show

可以使用-a
显示当前系统中由已安装过的包提供的所有能力

    4.for((i=1;i<10;i++))

# ./test.sh

-q –whatprovides webserver
查看指定的能力由哪一个软件包提供

     do

7、变量作用域

-q –whatrequires CAPABILITY
查询指定的CAPABILITY被哪个包所依赖

        程序段

默认情况下,变量具有全局作用域,如果想把它设置为局部作用域,可以在其前加入local;例如:

-qR 软件包名
查看指定的软件包依赖哪些能力

     done

local a=”hello”

-qc 软件包名 查看配置文件

    说明:在for循环中,可以用$(seq 1
100),或者{1..100} 表示连续的数或者字母,${RANDOM}
linux随机数变量。范围[0,32767]

使用局部变量,使得函数在执行完毕后,自动释放变量所占用的内存空间,从而减少系统资源的消耗,在运行大型的程序时,定义和使用局部变量尤为重要

-qd 软件包名 查看帮助文档

shell script 的调试:

 

-ql 软件包名
查看该软件包所提供的所有文件

  sh -nvx filename.sh 
-n 不执行文件,仅查询语法问题,-v 执行前,先输出文件,-x 将文件内容和输出语句同步输出。

二、函数实操

-qi 软件包名 查看软件包的信息

source filename.sh 执行脚本:

1、判断 user 是否存在,若存在输出其
shell;要求:

-q –scripts 软件包名
查看软件包的安装脚本

  执行该脚本是在父bash中执行的,执行完后,可以直接 echo
${filename.sh中的变量},得到变量值;而sh
filename.sh 后,echo不能输出文件中的变量名。

从命令行参数接受一个用户名,根据该用户是否存在而输出相应的信息

-V
查看指定包所提供的文件是否发生过改变

  

脚本里面定义一个函数,用于查询用户是否存在

S file Size differs

定义另外一个函数,用于获取用户的 shell

M Mode differs (includes permissions and
file type)

# vim test.sh

5 digest (formerly MD5 sum)
differs

#!/bin/bash

D Device major/minor number
mismatch

exist() {

L readLink(2) path mismatch

if [ -z “$1” ]; then –函数内部的 $1 代表函数的第一个参数

U User ownership differs

echo “wrong parameter” >&2

G Group ownership differs

return 1

T mTime differs

fi

P capabilities differ

local file=/etc/passwd –定义一个局部变量

 

grep -qE “^${1}:” $file

-K|checksig rpmfile
检查包的完整性和签名

return $? –函数返回一个值

–nosignature: 不检查来源合法性

}

–nodigest:不检查包完整性

getshell() {

 

if [ -z “$1” ]; then

rpm包升级

echo “wrong parameter” >&2

升级:

return 1 –返回非零,用于表示出错

rpm {-U|–upgrade} [install-options]
PACKAGE_FILE…

fi

rpm {-F|–freshen} [install-options]
PACKAGE_FILE…

local file=/etc/passwd

upgrade:安装有旧版程序包,则“升级”

local line shell

如果不存在旧版程序包,则“安装”

line=$(grep -E “^${1}:” $file)

freshen:安装有旧版程序包,则“升级”

shell=${line##*:}

如果不存在旧版程序包,则不执行升级操作

echo $shell

rpm -Uvh PACKAGE_FILE …

return 0

rpm -Fvh PACKAGE_FILE …

}

–oldpackage:降级

 

–force: 强制安装

if [ -z “$1” ];then –这里的$1 不在函数中,代表的是脚本的第一个参数

 

echo “Usage: $(basename $0) <username>” >&2

rpm2cpio 包文件|cpio –itv
预览包内文件

exit 1

rpm2cpio 包文件|cpio –id “*.conf”
释放包内文件

fi

 

user=$1

实验:丢失文件恢复

if exist $user; then –调用函数 exist 就像调用普通命令一样

/etc/inittab

echo “Shell of user $user: $(getshell $user)” –调用函数getshell

1.rpm -qf /etc/inittab

else

initscripts-9.03.58-1.el6.centos.x86_64

echo “user $user doesn’t exist”

 

fi

2.cp
/media/Packages/initscripts-9.03.58-1.el6.centos.x86_64.rpm /app

2、要求:

 

定义一个函数,用于查询某个用户的最后登录时间

3.cd /app; rpm2cpio
initscripts-9.03.58-1.el6.centos.x86_64.rpm |cpio -id

要求在函数中出现的变量必须是本地变量

 

如果查询到结果,函数应该返回真值,否则,应该返回假值

4.cp etc/inittab /etc

如果能够查到记录,就输出记录,否则就输出相应的出错信息

 

# vim test.sh

 

#!/bin/bash

 

help() {

yum

echo “Usage: user_last <name>” >&2

vim /etc/yum.repos.d/dvd.repo

}

[base]

last_log() {

name=magedu centos 7 dvd

local time

baseurl=file:///media

time=$(lastlog -u ${username} | tail -n1 | awk ‘{print
$(NF-5),$(NF-4),$(NF-3),$(NF-2),$(NF-1),$NF}’)

 

if [ -z “$time” ];then

yum

echo “no record”

CentOS: yum, dnf

return 1

YUM: Yellowdog Update
Modifier,rpm的前端程序,可解决软件包相关依

else

赖性,可在多个库之间定位软件包,up2date的替代工具

echo “last login time of user $username: $time”

yum repository: yum
repo,存储了众多rpm包,以及包的相关的元数据

return 0

文件(放置于特定目录repodata下)

fi

文件服务器:

}

http://

if [ -z “$1” ]; then

发表评论

电子邮件地址不会被公开。 必填项已用*标注