目的:
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%%(*} 削除‘(’和后面的所有字符