无法在 bash 脚本中 tar 文件名中包含空格的文件数组
Cannot tar array of files with spaces inside filename inside bash script
我有 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'
$
有什么想法吗?
问题是,您对 '
进行了转义,从而将其添加到文件名中,而不是用它来引用字符串:
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"
我有 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'
$
有什么想法吗?
问题是,您对 '
进行了转义,从而将其添加到文件名中,而不是用它来引用字符串:
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"