Bash脚本问题:如何用CLI传入参数作为range上限生成文件
问题解决方法
问题根源
你遇到的问题是bash大括号展开不支持变量解析:{1..$numfiles}这种写法中,bash会先处理大括号展开,再替换变量,导致最终传给parallel的是字符串{1..200}而非1到200的数字序列,parallel只能识别这一个参数,因此生成了带大括号的错误文件名。
解决方案
方案一:用seq+parallel批量处理
修正后的脚本可以正确生成指定数量的文件,同时兼容总数不是10倍数的情况:
num_files=$1 seq "$num_files" | parallel -N 10 'cat source.txt | tee $(printf "copy%s.txt " {1..$#})'
seq "$num_files":生成1到目标数量的数字序列,每行一个数字parallel -N 10:将序列按每组10个分组处理printf "copy%s.txt " {1..$#}:根据当前组的实际参数个数动态生成文件名列表,避免最后一组不足10个时产生无效文件名
方案二:用bash原生循环实现(无需parallel)
如果不需要并行处理,用bash循环更直观且无依赖:
num_files=$1 for ((i=1; i<=num_files; i+=10)); do end=$((i + 9)) # 处理总数不是10倍数的情况 [[ $end -gt $num_files ]] && end=$num_files # 生成当前组的所有文件名 file_list=$(seq -f "copy%g.txt" "$i" "$end") # 一次性生成副本 cat source.txt | tee $file_list done
内容的提问来源于stack exchange,提问作者MeanwhileInHell
相关产品推荐
相关产品推荐

