我在脚本中将一个包含空格的带引号的文件名列表传递给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
输出通常是错误的。Glob扩展和find
是更好的选择。
编辑:修复了第一个示例中的拼写错误