bash函数 - 以空格作为参数的文件名

时间:2015-06-22 11:21:39

标签: bash

我有这个bash函数,它将文件作为参数:

txz()
{
  file_in=${@:1:$#-1}
  file_out=${@: -1}

  echo "file_in=${file_in}"
  echo "file_out=${file_out}"

  tar -cvf - ${file_in} | xz -e9zf - > "${file_out}"
}

应该使用至少2个参数调用该函数。最后一个参数始终是归档名称,其余参数是要压缩的文件。当我为名称中没有空格的文件调用它时,该函数应该正常工作,如:

txz File1 File2 archive.tar.xz

但它失败了:

txz "File 1" "File 2" archive.tar.xz

file_in=File 1 File 2
file_out=archive.tar.xz
tar: File: Cannot stat: No such file or directory
tar: 1: Cannot stat: No such file or directory
tar: File: Cannot stat: No such file or directory
tar: 2: Cannot stat: No such file or directory
tar: Exiting with failure status due to previous errors

我也试过创建一个数组,但它也不起作用:

txz()
{
  file_in=(${@:1:$#-1})
  file_out=${@: -1}

  echo "file_in=${file_in[@]}"
  echo "file_out=${file_out}"

  tar -cvf - "${file_in[@]}" | xz -e9zf - > "${file_out}"
}

我应该如何创建函数以使其适用于所有文件名?

1 个答案:

答案 0 :(得分:1)

您应该使用BASH数组来存储多个文件名:

txz() { 
   file_in=( "${@:1:$#-1}" )
   file_out="${@: -1}"
   echo "file_in=${file_in[@]}"
   echo "file_out=${file_out}"

   tar -cvf - "${file_in[@]}" | xz -e9zf - > "${file_out}"
}

PS:请注意$@在两项作业中必须具有双引号。