将字符串命令行参数传递给特定 Linux 命令的 bash 脚本

将字符串命令行参数传递给特定 Linux 命令的 bash 脚本

我在网上找到了以下命令来搜索pdf中的文本

find . -name '*.pdf' -exec sh -c 'pdftotext "{}" - | grep --with-filename --label="{}" --color "your pattern"' \;

我想通过脚本来自动执行此操作,因此我在脚本文件 search_pdf.sh 中编写了此操作

#!/bin/bash
echo $1
find . -name '*.pdf' -exec sh -c 'pdftotext "{}" - | grep --with-filename --label="{}" --color "$1"' \;

该脚本存在一些错误,它没有按预期工作。任何人都可以帮助我吗

答案1

尝试导出$1脚本中的 。

#!/usr/bin/env bash

pattern=$1
export pattern

find . -name '*.pdf' -exec sh -c 'pdftotext "{}" - | grep --with-filename --label="{}" --color "$pattern"' \;

但我建议将其重写为

#!/usr/bin/env bash
pattern=$1
export pattern

find . -name '*.pdf' -exec sh -c 'for f; do
  pdftotext "$f" - | grep --with-filename  --color "$pattern"
done' _ {} +

也许添加--label=$pattern

答案2

您需要将参数$0作为错误消息的 shell 名称和位置参数传递$1sh -c '...'调用:

#!/bin/bash

find . -name '*.pdf' -exec sh -c '
  pdftotext "{}" - | grep --with-filename --label="{}" --color "$1"
' sh "$1" \;

此处,sh用作$0(可以是任何名称),原始参数"$1"作为位置参数传递$1

如果您已pdfgrep安装,则不需要 pdf 到文本转换和额外的 shell:

find . -name '*.pdf' -exec pdfgrep -H "$1" {} \;

相关内容