如何将引用文件名列表作为参数传递给 Bash 中的另一个脚本?

How to pass list of quotated file names as a parameter to another script in Bash?

我一直坚持将名称中包含 space 的引用文件名列表传递给脚本中的 pdfunite。它在 shell 中有效,但在我的 bash 脚本中无效。

概念证明

这样我收集了所有用双引号包裹的给定模式的文件名":

# Collect quoted file names 
$ ls -x -Q "file"*.pdf
"file 01.pdf" "file 02.pdf" "file 03.pdf"

# Manually passed params in shell following the syntax: pdfunite <PDF-sourcefile-1>..<PDF-sourcefile-n> <PDF-destfile>
$ pdfunite "file 01.pdf"  "file 02.pdf" "file output.pdf"

# File is successfully created
$ ls "file output.pdf"
'file output.pdf'

我的脚本

在我的脚本中,我尝试以各种方式收集文件列表,但没有任何效果

# first approach - single line
pdfunite $(ls -x -Q "file"*.pdf) "file output.pdf"

# second approach - using variable
filesin=`ls -x -Q "file"*.pdf) "file output.pdf"`
pdfunite $filesin "file output.pdf"

我的脚本输出错误

上述两种方法均失败,并显示来自 pdfunite 的以下消息:

pdfunite '"file' '01.pdf"' '"file' '02.pdf"' 'file output' \
  I/O Error: Couldn't open file '"file': No such file or directory.

那么传递用引号封装的文件名列表有什么技巧呢?

pdfunite file*.pdf 'file output.pdf'

pdfunite 'file '*.pdf 'file output.pdf'

请注意,如果 file output.pdf 存在,它将在 glob 列表中,因此它不应该存在。

在 glob 扩展中不会发生单词拆分,但它会用于(未加引号的)命令替换。在脚本中解析或以其他方式使用 ls 输出通常是错误的。全局扩展和 find 是更好的选择。

编辑:修复了第一个示例中的拼写错误