bash - 如何在保留前导零的同时在 while 循环中递增数字 (BASH < V4)

标签 bash shell loops while-loop

我正在尝试编写一个 BASH 脚本,该脚本使用 cURL 下载播客的一些转录本。所有成绩单文件的名称仅相差三位数字:filename[three-digits].txt

  • 来自 filename001.txt
  • 到... filename440.txt

我将这三位数字作为一个数字存储在一个变量中,并在 while 循环中递增该变量。如何在不丢失前导零的情况下增加数字?

#!/bin/bash
clear

# [...] code for handling storage

episode=001
last=440

secnow_transcript_url="https://www.grc.com/sn/sn-"
last_token=".txt"

while [ $episode -le $last ]; do
    curl -X GET $secnow_transcript_url$episode$last_token > # storage location
    episode=$[$episode+001];
    sleep 60 # Don't stress the server too much!
done

我搜索了很多并且discovered nice approaches of others ,这确实解决了我的问题,但是出于好奇,我很想知道是否有解决我的问题的方法来保持 while 循环,尽管 for 循环首先会更合适,正如我所知的范围,但总有一天,我将需要一个 while 循环! :-)

#!/bin/bash
for episode in $(seq -w 01 05); do
    curl -X GET $secnow_transcript_url$episode$last_token > # ...
done

or for just a few digits (对于更多数字变得不切实际)

#!/bin/bash
for episode in 00{1..9} 0{10..99} {100..440}; do
    curl -X GET $secnow_transcript_url$episode$last_token > # ...
done

最佳答案

您可以使用 $((10#$n)) 删除零填充(并进行计算),并使用 printf 添加零填充。这里将两者放在一起以在 while 循环中递增一个零填充数字:

n="0000123"
digits=${#n} # number of digits, here calculated from the original number
while sleep 1
do
    n=$(printf "%0${digits}d\n" "$((10#$n + 1))")
    echo "$n"
done

关于bash - 如何在保留前导零的同时在 while 循环中递增数字 (BASH < V4),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21592667/

相关文章:

python - 使用参数从 python 执行 Shell 脚本

linux - csh 中带有 arg 1,2 的别名无法在 arg1 和 arg2 之间形成带有 '-' 的输出字符串

java - 尝试显示数据库数据时转换集合时出现问题

linux - 删除除每个前缀的最近 n 个文件之外的所有文件(基于文件日期)?

linux - 通过 cronjob 中的 bash 脚本进行 sftp : 'get' and 'rm' commands not found?

linux - 为什么 shell 解释单引号内的字符?

在有序列表中获取唯一相邻整数的 Pythonic 方法

java - 随机#猜谜游戏无限循环

linux - "cat x y z > z"是如何工作的?

json - 将多个文件与分隔符合并为一个文件