我有这个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}"
}
我应该如何创建函数以使其适用于所有文件名?
答案 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:请注意$@
在两项作业中必须具有双引号。