0

我的情况是,我的文件夹中有一些 pdf,这些 pdf 被系统编号

文件 fd13.pdf 文件 fd30.pdf 文件 fd47.pdf 文件 fd14.pdf 文件 fd31.pdf 文件 fd48.pdf 文件 fd15.pdf 文件 fd32.pdf 文件 fd49.pdf 文件 fd16.pdf 文件 fd33.pdf 文件 fd50.pdf

我正在编写一个脚本来将它们转换为 pdf

脚本如下

    #!/bin/bash
    pdftk "document fd1.pdf" "document fd2.pdf" "document fd3.pdf" 
"document fd4.pdf" "document fd5.pdf" "document fd6.pdf" 
"document fd7.pdf" "document fd8.pdf" "document fd9.pdf" "document fd10.pdf" 
"document fd11.pdf" "document fd12.pdf" "document fd12a.pdf" "document fd12b.pdf" 
"document fd12c.pdf" "document fd12d.pdf" "document fd13.pdf" "document fd14.pdf"
 "document fd15.pdf" "document fd16.pdf" "document fd17.pdf" "document fd18.pdf" 
output out.pdf

这也有效,

我的问题是首先我在目录上执行 ls

ls ./  > script.sh

然后我必须对单个数字然后是双数字进行排序,因为在这样的 ls 输出 文档中 fd11.pdf 位于文档 fd1.pdf之前
并且为了能够在我的脚本中使用它们,我必须在文件名中添加双引号” “这部分我必须手动完成。

我想自动为文件名添加双引号并按排序顺序获取文件名,我该如何处理这两个问题?

我在 Ubuntu 12.04

4

1 回答 1

1

这是一个引用问题。

为了演示看看脚本demo1.sh

declare -a args=( "$@" ) 
echo ${#args[@]}  # count the elements of the array args

bash demo1.sh *pdf将为您提供正确数量的 pdf 文件。

如果您改用脚本 demo2.sh

declare -a args=( $@ )
echo ${#args[@]}  # count the elements of the array args

bash demo2.sh *pdf会给你数量的pdf文件。相反,它会计算每个文件两次。

man bash解释见:

@ 展开为位置参数,从一开始。当扩展出现在双引号内时,每个参数都扩展为一个单独的单词。也就是说,"$@" 等价于 "$1" "$2" ... 如果双引号扩展出现在一个单词中,则第一个参数的扩展与原始单词的开头部分连接,并且最后一个参数的扩展与原始单词的最后一部分相连。当没有位置参数时,"$@" 和 $@ 扩展为空(即,它们被删除)。

以下脚本应该可以工作:

#!/bin/bash
pdftk "${@}" output out.pdf

您可以通过以下方式调用它:

ls -Q -v *.pdf |xargs script
于 2013-03-06T19:15:22.040 回答