.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までの整数を表すすべての10進数シーケンスと一致します。これがすぐにandと一致する<$month-$month>
ように使用する理由です。<2-2>
2
02
たとえば、glob(n)
修飾子はglob拡張を数字順にソートしてfile-12-2.pdf
最初に来ますfile-12-13.pdf
。file-12-03.pdf