该脚本是可以判断传来的文件名,然后通过不同的文件扩展名来调用不同的解压程序;该脚本比较有特点的是在文件名处理的时候。
#!/bin/bash
UNPACK=1
if [ ${1##*.} = bz2 ] ; then
TEMP=${1%.*}
if [ ${TEMP##*.} = tar ] ; then
tar jxvf $1 2> /dev/null 1>&2
UNPACK=$?
echo This is a tar.bz2 package
else
bunzip2 $1 2> /dev/null 1>&2
UNPACK=$?
echo This is a bz2 package
fi
fi
if [ ${1##*.} = gz ] ; then
TEMP=${1%.*}
if [ ${TEMP##*.} = tar ] ; then
tar zxvf $1 2> /dev/null 1>&2
UNPACK=$?
echo This is a tar.gz package
else
gunzip $1 2> /dev/null 1>&2
UNPACK=$?
echo This is a gz package
fi
fi
if [ ${1##*.} = tar ] ; then
tar xvf $1 2> /dev/null 1>&2
UNPACK=$?
echo This is a tar package
fi
if [ $UNPACK = 0 ] ; then
echo Success!
exit 0
else
echo Maybe it is not a package or the package is damaged?
exit 1
fi
脚本解释:
#下面这一行不是注释,是声明,即该脚本用/bin/bash来解析执行
#!/bin/bash
#这个变量是用来判断程序的执行结果,非零为成功执行,0为失败,这里初始值为1
UNPACK=1
#${parameter#word},${parameter##word}从开头删除匹配模式匹配的字符,在这里word是一个模式(pattern), 如果#parameter的开始匹配word模式,那么第一个的结果是最短匹配,第二个的结果是最长匹配:假设$1的值为file.tar.bz2 则${1##*.}
#的结果为bz2,${1#*.}的结果为tar.bz2
if [ ${1##*.} = bz2 ] ; then
#${parameter%word},${parameter%%word}从末尾删除匹配模式匹配的字符,在这里word是一个模式(pattern), 如果 #parameter的开始匹配word模式,那么第一个的结果是最短匹配,第二个的结果是最长匹配:假设$1的值为file.tar.bz2 则
#${1%%.*}的结果为file,${1%.*}的结果为file.tar
TEMP=${1%.*}
#根据上面的分析,如果TEMP="file.tar"则${TEMP##*.} 的值为tar
if [ ${TEMP##*.} = tar ] ; then
#通过上面的if判断完了以后,可以确定该文件的后缀名为:.tar.bz2,然后可以使用tar jxvf来解压
#">/dev/null"意思是将正确执行标准输出1重定向到/dev/null黑洞里
#"2>&1" 意思是将错误执行标准输出2重定向到标准输出1,最终再通过 ">/dev/null" 将数据丢到黑洞里
tar jxvf $1 > /dev/null 2>&1
#$?的值为上一步的执行结果,如果上一步正确执行,则$?的值为0否则为非零数字
UNPACK=$?
echo This is a tar.bz2 package
else
#程序到这里可以确定该文件的扩展名为.bz2,可以直接用bunzip来解压,同时将结果重定向到/dev/null中
bunzip2 $1 > /dev/null 2>&1
UNPACK=$?
echo This is a bz2 package
fi
fi
#如果$1的值为file.tar.gz则${1##*.}的结果为gz,如果换为${1#*.}结果为tar.gz
if [ ${1##*.} = gz ] ; then
#如果上一个if成立,即文件的最后一个扩展名为.gz则TEMP获取的是除.gz以外的部分
TEMP=${1%.*}
#获取TEMP最后的一个扩展名,假设TEMP的值为file.tar,则TEMP##*.}值为tar
if [ ${TEMP##*.} = tar ] ;then
#程序到这里可以确定该文件的扩展名为.gz,可以用tar zxvf来解压,同时将结果重定向到/dev/null中
tar zxvf $1 > /dev/null 2>&1
#查看上一步的执行结果
UNPACK=$?
echo This is a tar.gz package
else
#程序到这里可以确定该文件的扩展名为.gz,可以直接用gunzip来解压,同时将结果重定向到/dev/null中
gunzip $1 > /dev/null 2>&1
#查看上一步的执行结果
UNPACK=$?
echo This is a gz package
fi
fi
#如果$1的扩展名为.tar
if [ ${1##*.} = tar ] ;then
#直接通过tar xvf 来释放文件
tar xvf $1 > /dev/null
#查看上一步执行结果
UNPACK=$?
echo This is a tar package
fi
#判断如果$UNPACK的值为0则说明解压成功,脚本返回0 (exit 0)
if [ $UNPACK = 0 ] ; then
echo Success!
exit 0
#如果$UNPACK的值为非零,则说明解压失败,脚本返回1 (exit 1)
else
echo Maybe it is not a package or the package is damaged?
exit 1
fi