You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Bash中通过变量实现数字范围输出并应用于pdftk?

问题本质

bash的**大括号展开(Brace Expansion)**优先级高于变量替换,所以当你写{1..$num}时,bash会先处理大括号语法,此时$num还没被替换成实际数值,自然无法展开成连续数字序列,只会原样输出1..$num的字面内容——这就是直接写{1..10}能正常工作,但用变量就失效的原因。

解决办法

下面提供几种实用的解决方案,按需选择:

1. 使用seq命令生成序列

seq可以直接生成指定范围的数字序列,结合命令替换就能替代大括号展开的作用:

#!/bin/bash
num=10
# 打印1到10的数字
echo $(seq 1 $num)
# 处理pdftk的PDF合并
pdftk $(seq -f "%g.pdf" 1 $num) cat output final.pdf
  • seq -f "%g.pdf" 用来给每个数字添加.pdf后缀,直接生成1.pdf 2.pdf ... 10.pdf的序列。

2. 用循环构造数组(更安全)

如果涉及的文件名可能包含特殊字符(比如空格),用数组存储文件名是更稳妥的方式:

#!/bin/bash
num=10
# 初始化空数组
pdf_files=()
# 循环生成文件名并加入数组
for ((i=1; i<=num; i++)); do
    pdf_files+=("$i.pdf")
done
# 打印所有文件名
echo "${pdf_files[@]}"
# 执行pdftk合并
pdftk "${pdf_files[@]}" cat output final.pdf

3. 使用eval(谨慎场景使用)

eval会强制重新解析命令行,先完成变量替换再处理大括号展开,但注意:如果num的值来自不可信输入(比如用户输入),eval可能导致安全风险,仅在变量完全可控的场景使用:

#!/bin/bash
num=10
# 展开数字序列
eval echo {1..$num}
# 执行pdftk合并
eval pdftk {1..$num}.pdf cat output final.pdf

内容的提问来源于stack exchange,提问作者Biki Teron

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.27 03:05:18