无法在 bash 脚本中 tar 文件名中包含空格的文件数组

Cannot tar array of files with spaces inside filename inside bash script

我有 bash 脚本 my_tar.sh,它在 3 个文件上调用 tar czf output.tgz,文件名空间从数组传递:filefile 2file 3.

#!/bin/bash

declare -a files_to_zip

files_to_zip+=(\'file\')
files_to_zip+=(\'file 2\')
files_to_zip+=(\'file 3\')

echo "tar czf output.tgz "${files_to_zip[*]}""
tar czf output.tgz "${files_to_zip[*]}" || echo "ERROR"

虽然存在三个文件,但当tar在脚本中是运行时,它以错误结束。但是,当我在 bash 控制台中字面 运行 echo 输出(与 my_tar.sh 的下一个命令相同)时,tar 运行 没问题:

$ ls
file  file 2  file 3  my_tar.sh
$ ./my_tar.sh
tar czf output.tgz 'file' 'file 2' 'file 3'
tar: 'file' 'file 2' 'file 3': Cannot stat: No such file or directory
tar: Exiting with failure status due to previous errors
ERROR
$ tar czf output.tgz 'file' 'file 2' 'file 3'
$ 

有什么想法吗?

问题是,您对 ' 进行了转义,从而将其添加到文件名中,而不是用它来引用字符串:

files_to_zip+=(\'file 2\')

files_to_zip+=( 'file 2' )

此外,通常建议使用 @ 而不是星号 (*) 来引用所有数组元素,因为引用时不会解释星号 (-> http://tldp.org/LDP/abs/html/arrays.html, 示例 27-7) .

此外,我假设您的意图是在打印数组元素时在字符串中加上引号。为此,您需要转义引号。

echo "tar czf output.tgz \"${files_to_zip[@]}\""

你的固定脚本看起来像

#!/bin/bash

declare -a files_to_zip

files_to_zip+=( 'file' )
files_to_zip+=( 'file 2' )
files_to_zip+=( 'file 3' )

echo "tar czf output.tgz \"${files_to_zip[@]}\""
tar czf output.tgz "${files_to_zip[@]}" || echo "ERROR"