使用单独的参数执行不同的命令

时间:2017-05-08 17:35:38

标签: linux bash shell

假设我想创建一个脚本来提取列为参数的所有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结尾的参数来执行单独的提取?

3 个答案:

答案 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>