bash正则expression式匹配string

我想写一个包含一个函数,所以当给.tar.tar.bz2.tar.gz等文件的bash脚本,它使用焦油与相关的开关解压缩文件。

我正在使用,如果ELIF然后语句testing文件名,看看它以什么结束,我不能让它匹配使用正则expression式元字符。

为了不断重写脚本,我在命令行使用'test',我认为下面的语句应该可以工作,我已经尝试了括号,引号和metacharaters的所有组合,但仍然失败。

 test sed-4.2.2.tar.bz2 = tar\.bz2$; echo $? (this returns 1, false) 

我敢肯定,这个问题很简单,而且我到处都是,但我无法想象如何去做。 有人知道我怎么能做到这一点?

要匹配正则expression式,您需要使用=~运算符。

尝试这个:

 [[ sed-4.2.2.tar.bz2 =~ tar.bz2$ ]] && echo matched 

或者,您可以使用通配符(而不是正则expression式)和==运算符:

 [[ sed-4.2.2.tar.bz2 == *tar.bz2 ]] && echo matched 

如果可移植性不是问题,我build议使用[[而不是[或者test因为它更安全和更强大。 看看testing,[和[[? 了解详情。

一个function来做到这一点

 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 } 

其他注意

为了回应以上评论中的水瓶座权力, We need to store the regex on a var

在匹配expression式之后设置variablesBASH_REMATCH,并且$ {BASH_REMATCH [n]}将匹配包含在括号中的第n个组,即在以下${BASH_REMATCH[1]} = "compressed"${BASH_REMATCH[2]} = ".gz"

 if [[ "compressed.gz" =~ ^(.*)(\.[az]{1,5})$ ]]; then echo ${BASH_REMATCH[2]} ; else echo "Not proper format"; fi 

(上面的正则expression式并不意味着对文件命名和扩展是有效的,但是它适用于这个例子)

shopt -s nocasematch

 if [[ sed-4.2.2.$LINE =~ (yes|y)$ ]] then exit 0 fi