我有 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"
我在 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"