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

ashshell(busybox),检查文件扩展名?,shell,busybox,Shell,Busybox,我正在将一个脚本从bash移植到busybox shell,ash-如何检查文件的扩展名(并去掉该扩展名以获得一个生成目录名的文件名) bash代码片段如下所示: 运行脚本时,它包含一个输出,显示检查扩展的代码未被识别: 文件的扩展名未知:zlib-1.2.11.tar.gz 使用expr命令进行正则表达式匹配,并使用%运算符去除已知后缀expr隐式地将所有正则表达式锚定到字符串的开头,因此您需要以*开始每个正则表达式以匹配后缀expr还写入与标准输出匹配的字符数,但您可能不想看到这一点 if

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

bash代码片段如下所示:

运行脚本时,它包含一个输出,显示检查扩展的代码未被识别:

文件的扩展名未知: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

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


由于已经匹配了特定扩展名,因此可以使用,例如,
${filename%.tar.gz}
而不是
basename
。(原始脚本没有像
basename
那样从路径中剥离前导目录。)但是+1用于使用
case
模式匹配就足够了(就像在这种情况下一样)。很好!我忘了basename。这很有趣,我以前没见过expr。很少需要它。它还执行整数运算,但该函数已被算术表达式
$(…)
完全取代。它在POSIX环境中唯一需要的是正则表达式匹配。
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 "$filename" in
*.tar.gz)
    tar something
    dirname=$(basename "$filename" .tar.gz)
    ;;
*.tar.bz2)
    tar something
    dirname=$(basename "$filename" .tar.gz2)
    ;;
# and so on
esac