我有bash脚本my_tar.sh
,它在3个文件中调用tar czf output.tgz
,这些文件的文件名空间从数组file
,file 2
和file 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'
$
有什么想法吗?
答案 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"