我有一个名为 的脚本get_numbers.sh
,我想用它从.pdf
按日期顺序标记的文件中提取数据,使用pdfgrep
.
让我将我的问题简化为我认为的本质:
这些.pdf
s 被命名为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
从 切换bash
到zsh
确实有小数范围全局运算符(与 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>
可以匹配2
和02
。
glob(n)
限定符导致 glob 扩展按数字排序,因此它file-12-2.pdf
排在前面file-12-13.pdf
,file-12-03.pdf
例如。