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