スクリプト内の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までの整数を表すすべての10進数シーケンスと一致します。これがすぐにandと一致する<$month-$month>ように使用する理由です。<2-2>202

たとえば、glob(n)修飾子はglob拡張を数字順にソートしてfile-12-2.pdf最初に来ますfile-12-13.pdffile-12-03.pdf

おすすめ記事