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
我正在将脚本从 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