【问题标题】:bash function - file names with spaces as argumentsbash 函数 - 以空格作为参数的文件名
【发布时间】:2015-06-22 11:21:39
【问题描述】:

我有这个以文件为参数的 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}"
}

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

【问题讨论】:

    标签: bash


    【解决方案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:注意$@ 必须在两个分配中使用双引号。

    【讨论】:

      猜你喜欢
      • 2011-11-24
      • 2012-06-01
      • 2017-09-04
      • 1970-01-01
      • 2011-06-07
      • 1970-01-01
      • 2012-09-16
      • 1970-01-01
      • 2021-07-30
      相关资源
      最近更新 更多