특정 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오류 메시지의 셸 이름과 위치 인수로 호출 $1에 인수를 전달해야 합니다 sh -c '...'.

#!/bin/bash

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

여기서는 (어떤 이름이든 sh가능 $0) 원래 인수가 "$1"위치 인수로 전달됩니다 $1.

설치 한 경우 pdfgrepPDF를 텍스트로 변환하거나 추가 셸이 필요하지 않습니다.

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

관련 정보