스크립트 내의 glob 패턴에 매개변수를 전달합니다.

스크립트 내의 glob 패턴에 매개변수를 전달합니다.

.get_numbers.sh.pdfpdfgrep

내 문제를 본질이라고 생각하는 것으로 단순화하겠습니다.

이러한 s의 이름은 , , ... .pdf입니다 . 여기서 숫자는 파일에 있는 데이터의 월과 일에 해당합니다.file-07-01.pdffile-07-02.pdffile-07-31.pdf

다음과 같은 쉘 명령을 입력할 수 있습니다. pdfgrep -i "Total Number:" file-07-{01..12}.pdf

각 파일에서 07-01부터 07-12까지의 해당 텍스트를 원하는 대로 얻었습니다.

이에 대한 스크립트를 만들고 싶습니다. 시작 날짜와 종료 날짜, 월을 입력하기만 하면 됩니다. 첫 번째 시도는 다음과 같습니다.

    #!/usr/bin/bash

    if [ "$#" -eq 3 ]
    then
        START_DAY=$1 
        END_DAY=$2
        MONTH=$3
    else
        echo "INCORRECT USAGE:"
        exit 1
    fi   


    pdfgrep -i "Total Number:" file-$MONTH-{$START_DAY..$END_DAY}.pdf

하지만 이렇게 하면 bash get_numbers.sh 01 12 07오류 메시지가 나타납니다.

pdfgrep: Could not open file-07-{01..12}.pdf

file-$MONTH-{$START_DAY..$END_DAY}.pdf주위를 둘러보면서 스크립트가 glob이 아닌 리터럴 문자열로 해석되므로 이 작업을 수행할 때 주의해야 한다는 것을 깨달았습니다 . 변수로 만들거나 주위에 큰따옴표를 추가하여 수정해 보았으나 결과가 바뀌지 않습니다. 내가 무엇을 놓치고 있나요?

답변1

from 전환에는 소수 범위 전역 연산자가 bash있습니다 zsh(bash와는 반대로 의 변수에서도 작동 {$start..$end}하지만 전역 연산자는 아닙니다).

#!/usr/bin/zsh -
if
  (( $# == 3 )) &&
    start_day=$1 end_day=$2 month=$3 &&
    [[ $start_day = <1-31> && $end_day = <1-31> && $month = <1-12> ]] &&
    (( end_day >= start_day ))
then
  pattern="file-<$month-$month>-<$start_day-$end_day>.pdf"
  exec pdfgrep -i "Total Number:" $~pattern(n) 
else
  print -u2 Incorrect usage
  exit 1
fi  

<1-5>2, 02, 002...를 포함하여 1부터 5까지의 정수를 나타내는 모든 십진수 시퀀스와 일치합니다. 이것이 바로 and 와 일치할 수 <$month-$month>있도록 사용하는 이유입니다 .<2-2>202

예를 들어 glob (n)한정자는 glob 확장을 숫자순으로 정렬하여 file-12-2.pdf먼저 오게 합니다 file-12-13.pdf.file-12-03.pdf

관련 정보