假设我想创建一个脚本来提取列为参数的所有tar.gz和tar.bz2文件。到目前为止我所做的是:
if [[ $@ =~ .*"tar.gz".* ]] || [[ $@ =~ .*"tar.bz2".* ]]; then
for i in $@ =~ .*"tar.gz".*; do
tar -xvzf "$i"
done
for p in $@ =~ .*"tar.bz2".*; do
tar -xvjf "$p"
done
else
echo "tar.gz or tar.bz2 files required."
fi
第一行是否成功评估了tar.gz或tar.bz2文件是否存在,但我的问题是其余的。变量未正确设置,脚本最终尝试提取两个提取命令列出的每个变量。如何分隔以tar.gz和tar.bz2结尾的参数来执行单独的提取?
答案 0 :(得分:3)
没有任何内置语法可用于提取和迭代数组中匹配的元素,正如您在此处尝试的那样。
以下是POSIX兼容的,具体取决于没有基本原则:
count=0
for arg; do
case $arg in
*.tar.gz) tar -xvzf "$arg"; count=$(( count + 1 ));;
*.tar.bz2) tar -xjvf "$arg"; count=$(( count + 1 ));;
esac
done
if [ "$count" -eq 0 ]; then
echo "tar.gz or tar.bz2 files required" >&2
fi
答案 1 :(得分:3)
你应该迭代参数并测试每个参数,如下所示:
#!/bin/bash
declare -i count
for file in "$@"
do
if
[[ $file =~ .*[.]tar[.]gz$ ]]
then
tar -xvzf "$file"
elif
[[ $file =~ .*[.]tar[.]bz2$ ]]
then
tar -xvjf "$file"
else
continue
fi
count+=1
fi
((count)) || echo "tar.gz or tar.bz2 files required."
如果您可以依靠GNU tar
自动选择正确的解码算法,您可以将其简化为:
#!/bin/bash
declare -i count
for file in "$@"
do
[[ $file =~ .*[.]tar[.](gz|bz2)$ ]] || continue
tar -xvf "$file"
count+=1
fi
((count)) || echo "tar.gz or tar.bz2 files required."
答案 2 :(得分:0)
有点偏离主题,自2007年以来使用GNU tar it detects the archive type automatically from the file extension进行提取时,无需指定z|j|J
。
即。 tar xvf <filename>
。