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

时间:2018-10-13 21:27:01

标签: arrays bash tar quoting

我有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'
$ 

有什么想法吗?

1 个答案:

答案 0 :(得分:1)

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

files_to_zip+=(\'file 2\')

vs

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"