0

ファイルの名前変更/作成を自動化しようとしています。テスト用の初期スクリプトがあります。すでに見回しましたが、関連するものが見つかりません。

ここに私のサンプルスクリプトがあります

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

初期ファイルが存在しない/存在する場合、スクリプトは正常に動作しますが、以下の sh -x のように 3 回の発生後に開始が失敗します

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の後、先頭にゼロを付けずに-2にフォールバックします。私が間違ったことについての入力は大歓迎です
ありがとう

4

1 に答える 1

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コメントからの提案を使用してください

于 2015-06-30T05:28:11.477 に答える