如何在shell脚本bash中检查子字符串?

如何在shell脚本bash中检查子字符串?

实际上字符串是 new.tar.gz 我想检查这个文件是否是 tar 包?

答案1

使用file命令来检查它。

$ file new.tar.gz
new.tar.gz: gzip compressed data, last modified: Tue Sep 26 16:50:00 2017, from Unix

要检查压缩文件的内容,您必须将其解压缩,然后对其运行 file :

$ gunzip -k new.tar.gz; file new.tar
new.tar: POSIX tar archive (GNU)

答案2

从技术上讲,tar存档文件可以称为任何事物。在 Unix 中,文件名并不决定文件的格式或内容。

但是,如果我们将问题限制为确定变量$filenameether 中的文件名是否以字符串结尾.tar或包含字符串.tar.

case $filename in
    *.tar|*.tar.*) echo 'possibly a tar file' ;;
esac

上面允许.tar在名称末尾或.tar后跟另一个扩展名。

或者,在bash(以上工作在任何shshell 中,包括bash):

if [[ $filename =~ \.tar$  ]] ||
   [[ $filename =~ \.tar\. ]]; then
    echo 'possibly a tar file'
fi

或者,

if [[ $filename == *.tar   ]] ||
   [[ $filename == *.tar.* ]]; then
    echo 'possibly a tar file'
fi

如果您的文件包含一长串文件名,那么以下内容将告诉您哪个文件名该文件中的行以字符串结尾.tar或包含字符串.tar.

grep -E '\.tar$|\.tar\.' file.list

-E标志告诉grep将给定模式视为扩展正则表达式(以处理|)。

或者,

grep -e '\.tar$' -e '\.tar\.' file.list

列出最终的长列表中每个文件的扩展名(存储在file.list):

sed 's/.*\.//' file.list

sed表达式s/.*\.//将删除每行上的所有内容,直到最后一个点(包括最后一个点)。

相关内容