无法在 bash 脚本中压缩文件名中带有空格的文件数组

问题描述 投票:0回答:2

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

有什么想法吗?

arrays bash tar quoting
2个回答
2
投票

问题是,您转义了

'
,从而将其添加到文件名中,而不是使用它来引用字符串:

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"

0
投票

我在 MacOS 系统上打包和压缩许多目录、文件和程序时遇到问题,并通过在另一台计算机上解压所有这些文件来使其工作。我不知道这是否有帮助,但是经过多次测试后我做到了。 这是我使用的脚本,它可以很好地处理文件夹、.app 和所有内容上的空格。 我必须添加 doble doble 引号以及对变量的引号: 这将全部压缩并 bzip2。 也许可以帮助某人。

#!/bin/bash

## Routes
epic=""/Applications/Epic\ Games\ Launcher.app""
urshared=""/Users/Shared/Epic\ Games""
wwise=""/Applications/Wwise\ Launcher.app""
ww1170=""/Applications/Audiokinetic/Wwise\ 2022.1.7.8290""
ww1171=""/Library/Application\ Support/Audiokinetic/Wwise\ 2022.1.7.8290""
ww202=""/Applications/Audiokinetic/Wwise\ 2022.1.4.8202""
ww202b=""/Library/Application\ Support/Audiokinetic/Wwise\ 2022.1.4.8202""
libframe=""/Library/Frameworks""
advgame=""/Applications/Audiokinetic/Wwise\ Adventure\ Game\ 2022.1.0.230""
unityhub=""/Applications/Unity\ Hub.app""
uniyed2018=""/Applications/Unity/Hub/Editor/2018.4.17f1""
unityed2020=""/Applications/Unity/Hub/Editor/2020.3.40f1""
fmod=""/Applications/FMOD\ Studio.app""

tar -cjf franza.tgz "$epic" "$urshared" "$wwise" "$ww1170" "$ww1171" "$ww202" "$ww202b" "$libframe" "$advgame" "$unityhub" "$uniyed2018" "$unityed2020" "$fmod"

© www.soinside.com 2019 - 2024. All rights reserved.