目的:
1 查询rpm包是否可以被安装
2 查询rpm包信息说明
3 查询rpm包依赖的rpm包名
准备:
把路径/var/cache/yum/下子目录中存在以sqlite为后缀的文件复制到脚本实现的同一目录下,并改名为CentOS6.0_package_db.sqlite。
实现:
【脚本】
- #!/bin/bash
- SUCCESS=0
- E_NOARGS=65
- if [ -z "$1" ]
- then
- echo "Usage: `basename $0` rpm-file"
- exit $E_NOARGS
- fi
- {
- rpm -i --test $1 # 查询 rpm 包是否可以被安装
- if [ "$?" -eq $SUCCESS ]
- then
- echo "$1 can be installed."
- fi
- echo
- echo "Archive Description:"
- rpm -qpi $1 # 查询说明
- echo
- echo "Archive Listing:"
- rpm -qpl $1 # 查询列表
- echo
- echo "Requires Packages:"
- rpm -qpR $1|while read line
- do
- requirename=${line%%(*}
- {
- echo "select packages.name from packages inner join provides
- on packages.pkgKey = provides.pkgKey where provides.name = '$requirename';" |
- sqlite3 CentOS6.0_package_db.sqlite
- } #splite3为查询数据库的命令
- done|uniq #uniq删除其中重复的行
- } > "$1-query" # 把代码块中的所有输出都重定向到文件中
- cat "$1-query"
- echo
- echo "Results of rpm check in file $1-query"
脚本shell命令解析:
字符串比较运算符(请注意引号的使用,这是防止空格扰乱代码的好方法)
[-z string] 如果string长度为零,则为真
位置参数$1,$2,...,$N,$#代表了命令行的参数数量,$0代表了脚本的名字,第一个参数代表$1,第二个参数代表$2,以此类推,参数数量的总数存在$#中。
$?(显示最后命令的退出状态,0表示没有错误,其他值表面有错误)
子串削除
${string#substring}
从$string 的左边截掉第一个匹配的$substring
${string##substring}
从$string 的左边截掉最后一个个匹配的$substring
${string%substring}
从$string 的右边截掉第一个匹配的$substring
${string%%substring}
从$string 的右边截掉最后一个匹配的$substring
${line%%(*} 削除‘(’和后面的所有字符