如何将引用文件名列表作为参数传递给 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
是更好的选择。
编辑:修复了第一个示例中的拼写错误
我一直坚持将名称中包含 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
是更好的选择。
编辑:修复了第一个示例中的拼写错误