bash:以编程方式将多个参数传递给命令

时间:2017-10-24 07:10:57

标签: bash shell pandoc

我想运行pandoc命令(从一个或多个pdf创建.md个文件作为输入参数传递。

但是,.md文件列表不是先验的。

我想要像

一样运行
pandoc -s -o out.pdf file1.md ... fileN.md

我可以通过md检索find个文件,即

find . -name '*.md'

然后运行一个exec,即

find . -name '*.md' -exec bash -c 'pandoc -s -o out.pdf $0 -' {} \;

但是这会迭代地调用pandoc而不是一次性调用所有.md个文件。

3 个答案:

答案 0 :(得分:1)

您可以使用bash glob选项来执行此操作。设置数组中的所有.md文件,并一次性将其传递给命令。

shopt -s nullglob globstar
file_list=( **/file*.md )

现在已填充数组,并根据需要将其传递给命令

pandoc -s -o out.pdf "${file_list[@]}"

在将其传递给命令之前,您可以使用printf查看数组是否包含所需的所有文件

printf '%s' "${file_list[@]}"

nullglob选项是为了防止扩展在没有与file*.md glob模式匹配的文件时返回纯字符串。 globstar选项将对下面任何级别的子目录中的文件进行全局处理。

同样作为一步安全方法,您可以按照以下方式执行此操作,以确保在阵列计数非零时运行命令

(( "${#file_list[@]}" )) && pandoc -s -o out.pdf "${file_list[@]}"

使用unset(-u)标志一旦不再需要它就可以安全地禁用glob动作。

shopt -u nullglob globstar

答案 1 :(得分:1)

这里没有pandoc,但这样的事情应该有效:

find . -name "*.md" -print0 | xargs -0 pandoc -s -o out.pdf

答案 2 :(得分:0)

while IFS= read -r -d $'\0'; do files+=("$REPLY"); done < <(find . -name "*.md" -print0) && pandoc -s -o out.pdf "${files[@]}"

将文件传递到文件数组并在运行pandoc

后进行while循环