一个通过不同的文件扩展名来调用不同的解压程序的shell脚本

这是一个Shell脚本,用于根据传入的文件扩展名调用相应的解压工具,如tar、bunzip2、gunzip等。脚本首先判断文件的扩展名,然后执行相应的解压命令,如遇到.tar.bz2或.tar.gz文件,会先进行tar解压,再分别用bunzip2或gunzip解压。解压完成后,脚本会根据退出状态码判断解压是否成功,并给出相应提示。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

该脚本是可以判断传来的文件名,然后通过不同的文件扩展名来调用不同的解压程序;该脚本比较有特点的是在文件名处理的时候。

 

#!/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

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值