我试图写一个bash脚本,其中包含一个函数,当给定一个.tar
、.tar.bz2
、.tar.gz
等文件时,它使用tar和相关开关来解压文件。
我正在使用if elif then语句来测试文件名,看它的结尾是什么,但我不能用regex metacharacters来匹配。
为了避免不断重写脚本,我在命令行中使用了'test',我认为下面的语句应该可以工作,我已经尝试了所有可能的括号、引号和元数据的组合,但仍然失败了。
test sed-4.2.2.tar.bz2 = tar\.bz2$; echo $?
(this returns 1, false)
我确信这个问题很简单,我到处都找过了,但我无法理解如何去做。 有谁知道我怎么做吗?
extract () {
if [ -f $1 ] ; then
case $1 in
*.tar.bz2) tar xvjf $1 ;;
*.tar.gz) tar xvzf $1 ;;
*.bz2) bunzip2 $1 ;;
*.rar) rar x $1 ;;
*.gz) gunzip $1 ;;
*.tar) tar xvf $1 ;;
*.tbz2) tar xvjf $1 ;;
*.tgz) tar xvzf $1 ;;
*.zip) unzip $1 ;;
*.Z) uncompress $1 ;;
*.7z) 7z x $1 ;;
*) echo "don't know '$1'..." ;;
esac
else
echo "'$1' is not a valid file!"
fi
}
为了回应Aquarius Power在上面的评论,"我们需要在var上存储regex"。
变量BASH_REMATCH是在你匹配表达式后设置的,${BASH_REMATCH[n]}将匹配被括号包裹的第n组,即下面的${BASH_REMATCH[1]} = "compressed"
和${BASH_REMATCH[2]} = ".gz"
。
if [[ "compressed.gz" =~ ^(.*)(\.[a-z]{1,5})$ ]];
then
echo ${BASH_REMATCH[2]} ;
else
echo "Not proper format";
fi
(上面的重码并不意味着是一个有效的文件命名和扩展名,但它对这个例子是有效的)