在Bash循环中增加零填充int

时间:2015-06-30 05:19:01

标签: linux bash loops unix leading-zero

我正在尝试自动化文件重命名/创建,我有一个初始脚本进行测试,我已经环顾四周我找不到任何相关的内容

这是我的示例脚本

#!/bin/bash
file=`hostname`
if [[ -e $file.dx ]] ; then
    i="$(printf "%03d" 1)"
    while [[ -e $name-$i.dx ]] ; do
        let i++
    done
    name=$name-$i
fi
touch $name.dx

脚本在初始文件不存在/存在时正常工作但在3次出现后开始出错,如下面的sh -x

linux@cygwinhost ~/junkyard
$ sh -x exp.sh
++ hostname
+ name=cygwinhost
+ [[ -e cygwinhost.ext ]]
+ touch cygwinhost.ext

linux@cygwinhost ~/junkyard
$ sh -x exp.sh
++ hostname
+ name=cygwinhost
+ [[ -e cygwinhost.ext ]]
++ printf %03d 1
+ i=001
+ [[ -e cygwinhost-001.ext ]]
+ name=cygwinhost-001
+ touch cygwinhost-001.ext

linux@cygwinhost ~/junkyard
$ sh -x exp.sh
++ hostname
+ name=cygwinhost
+ [[ -e cygwinhost.ext ]]
++ printf %03d 1
+ i=001
+ [[ -e cygwinhost-001.ext ]]
+ let i++
+ [[ -e cygwinhost-2.ext ]]
+ name=cygwinhost-2
+ touch cygwinhost-2.ext

linux@cygwinhost ~/junkyard
$
<001>在001之后它回退到-2而没有前导零,任何关于我做错的输入都非常感激
谢谢

1 个答案:

答案 0 :(得分:1)

您的问题似乎是001++变为2而非002。为什么不使用

i=1
printf -v padded_i "%03d" $i
while [[ -e ${name}-${padded_i}.dx ]] ; do
    let i++
    printf -v padded_i "%03d" $i
done

线条少,但也更混乱:

i=1
while [[ -e ${name}-`printf "%03d" $i`.dx ]] ; do
    let i++
done
name=${name}-`printf "%03d" $i`.dx

更新:使用评论中的printf -v padded_i建议