将参数传递到脚本内的 glob 模式中

将参数传递到脚本内的 glob 模式中

我有一个名为 的脚本get_numbers.sh,我想用它从.pdf按日期顺序标记的文件中提取数据,使用pdfgrep.

让我将我的问题简化为我认为的本质:

这些.pdfs 被命名为file-07-01.pdf, file-07-02.pdf, ..., file-07-31.pdf,其中数字对应于文件中数据的月份和日期。

我可以输入 shell 命令,例如 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

从 切换bashzsh确实有小数范围全局运算符(与 bash 相反,它也可以使用变量 in {$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>将匹配表示从 1 到 5 的整数的任何十进制数字序列,包括 2、02、002...这就是为什么我们也使用<$month-$month>so that<2-2>可以匹配202

glob(n)限定符导致 glob 扩展按数字排序,因此它file-12-2.pdf排在前面file-12-13.pdffile-12-03.pdf例如。

相关内容