.get_numbers.sh
.pdf
pdfgrep
내 문제를 본질이라고 생각하는 것으로 단순화하겠습니다.
이러한 s의 이름은 , , ... .pdf
입니다 . 여기서 숫자는 파일에 있는 데이터의 월과 일에 해당합니다.file-07-01.pdf
file-07-02.pdf
file-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>
2
02
예를 들어 glob (n)
한정자는 glob 확장을 숫자순으로 정렬하여 file-12-2.pdf
먼저 오게 합니다 file-12-13.pdf
.file-12-03.pdf