2015-06-30 4 views
0

Я пытаюсь автоматизировать файлы переименовывать/создание, у меня есть первоначальный сценарий для тестирования, я уже посмотрел вокруг, я не могу найти что-нибудь связанноеIncrement нулевого проложенный ИНТ в цикле Баша

здесь мой образец сценарий

#!/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 появления, как и в ш -х ниже

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

[email protected] ~/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 

[email protected] ~/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 

[email protected] ~/junkyard 
$ 

после 001 он Откат к -2 без ведущие нули, любой вход на то, что я сделал неправильно очень ценится
Благодаря

+0

также появляется искать некоторые переменные окружение $ файлов , если он не установлен, ваш скрипт создаст скрытый файл с именем .dx в текущем каталоге ... возможно, переместите 'touch' в тестовый блок – technosaurus

+1

Btw: без нового процесса:' printf -vi '% 03d "1' – Cyrus

+0

$ файл в скрипте кажется опечаткой от меня :) – skelator

ответ

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 предложения от комментариев

+0

идеальное решение для моей проблемы! Благодаря! – skelator

+0

Поднимая комментарий Кира из главного сообщения с помощью bash, вы можете использовать 'printf -v i '% 03d" $ i' вместо использования под-оболочки для этого. –

+0

отметил, что Etan попробует оба подхода – skelator

Смежные вопросы