Ash shell (busybox),检查文件扩展名?

Ash shell (busybox), check file extension?

我正在将脚本从 bash 移植到 busybox shell,ash - 我如何检查文件的文件扩展名(并去除该扩展名以生成目录名) ?

bash 代码片段如下所示:

if [[ "$filename" =~ '\.tar\.gz' ]]; then
    tar -xzf "$filename"
    dirname="${filename::${#filename}-7}"
elif  [[ "$filename" =~ '\.tar\.bz2' ]]; then
    tar -xjf "$filename"
    dirname="${filename::${#filename}-8}"
elif  [[ "$filename" =~ '\.tar\.xz' ]]; then
    xzcat "$filename" | tar -x
    dirname="${filename::${#filename}-7}"
else
    echo "Unknown extension for file: ${filename}" >&2
    exit 1

在 运行 它包含的脚本上,我得到的输出显示无法识别检查扩展的代码:

Unknown extension for file: zlib-1.2.11.tar.gz

使用expr命令进行正则表达式匹配,使用%运算符去除已知后缀。 expr 隐式地将所有正则表达式锚定到字符串的开头,因此您需要以 .* 开头每个正则表达式以匹配后缀。 expr 还会写入与标准输出匹配的字符数,但您可能不希望看到它。

if expr "$filename" : '.*\.tar\.gz' > /dev/null; then
    tar -xzf "$filename"
    dirname="${filename%.tar.gz}"
elif expr "$filename" : '.*\.tar\.bz2' > /dev/null; then
    tar -xjf "$filename"
    dirname="${filename%.tar.gz}"
elif expr "$filename" : '.*\.tar\.xz' > /dev/null; then
    xzcat "$filename" | tar -x
    dirname="${filename%.tar.zx}"
else
    echo "Unknown extension for file: ${filename}" >&2
    exit 1
fi

使用case。使用 basename 删除扩展(我发现它比 ${var::} 扩展更干净)。

case "$filename" in
*.tar.gz)
    tar something
    dirname=$(basename "$filename" .tar.gz)
    ;;
*.tar.bz2)
    tar something
    dirname=$(basename "$filename" .tar.gz2)
    ;;
# and so on
esac