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

时间:2014-02-06 02:09:51

标签: bash shell loops while-loop

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

  • 来自filename001.txt
  • to .... 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循环首先会更合适,因为我知道范围,但是当我需要一个循环时,这一天将到来! : - )

#!/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

3 个答案:

答案 0 :(得分:3)

您可以使用$((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

答案 1 :(得分:1)

for ep in {001..440}应该有用。

但是,正如你想要一个while循环:让printf处理前导零

while (( episode <= last )); do
    printf -v url "%s%03d%s" $secnow_transcript_url $episode $last_token
    curl -X GET $url > # storage location
    (( episode++ ))
    sleep 60 # Don't stress the server too much!
done

答案 2 :(得分:0)

这会吗?

#!/bin/bash

i=1
zi=000000000$i
s=${zi:(-3)}
echo $s