如何在macOS的zsh中使用变量创建zip压缩文件
解决zsh中变量传递多文件给zip命令的报错问题
问题根源
你将多个文件路径存入单个字符串变量files,在zsh中直接展开$files时,它会把整个字符串当作单个参数传递给zip命令——也就是说zip会尝试寻找一个名为/var/log/install.log /var/log/jamf.log(包含空格的完整文件名)的文件,自然找不到。而bash默认会对未加引号的字符串变量做分词拆分,将其拆分为两个独立参数,因此能正常执行。
解决方案
方法一:使用数组存储文件路径(推荐)
zsh原生支持数组,用数组存储多个文件路径是更规范、更安全的方式(尤其适合文件路径含空格的场景):
#!/bin/zsh # 用数组存储多个文件路径 files=(/var/log/install.log /var/log/jamf.log) # 展开数组,每个元素作为单独参数传递 zip /private/tmp/archivtest.zip "${files[@]}"
注:这里-r参数其实可以省略,因为你压缩的是单个文件而非目录,zip会自动处理;如果后续要压缩目录,再加上-r即可。
方法二:强制zsh对字符串变量分词拆分(不推荐)
如果一定要用字符串变量存储路径,可以通过${=files}语法强制zsh对变量内容做分词拆分,将其拆分为多个独立参数:
#!/bin/zsh files="/var/log/install.log /var/log/jamf.log" zip /private/tmp/archivtest.zip ${=files}
⚠️ 注意:如果文件路径包含空格、特殊字符,这种方法会出错,因此仅适用于路径无特殊字符的简单场景,优先推荐数组方案。
内容的提问来源于stack exchange,提问作者Thrawnium
相关产品推荐
相关产品推荐

