2017-06-08 9 views
1

私は初心者でbashスクリプトを始めます。Bash - inside forループが終了しないうちに

私は現在の作業ディレクトリdir1-dir10 + script.sh +「tocopyfile」というファイルに10のディレクトリを持っています。

dir1-10は空です。

dir=`pwd` 
i="0" 
for directory in `ls $dir`;do 
     while [ $i -le 10 ] 
     do 
     cp tocopyfile $directory/file$i & 
     i=$[$i+1] 
     done 
done 

スクリプトは、すべてのディレクトリにファイル「tocopyfile」の10枚のコピーをコピーしてください(dir1-: tocopyfileは、次のコードが含まれています、私の研修 script.shの目的のために使用されるテストテキストファイルです10)をファイル名に置き換えます。問題は残りの残りのディレクトリにwhileループを実行せずにスクリプトが最初のディレクトリの後に存在することです。

誰かが私が間違っていることを説明できますか?

お願いします。

答えて

2

すぐ外側のループの反復ごとにiの値をリセットする必要があるということです。

for directory in `ls $dir`; do # No! but more on that in a moment 
    i=0 
    while [ $i -le 10 ] 

コードには他にもいくつか問題があります。

  1. dir=$(pwd)はほとんど常に無意味です。 bashには、現在の作業ディレクトリの名前を含む変数PWDがすでに用意されています。しかし、実際にはこれは必要ありません。 ./*/を使用して、現在の作業ディレクトリ内のディレクトリのリストに展開することができます。

  2. 出力では、lsをスクリプトで使用しないでください。

  3. $[...]は廃止された構文です。代わりに$((...))を使用してください。


ビットをあなたのコードのクリーンアップ、我々はその非常に便利のため

for directory in ./*/; do 
    i=0 
    while [ "$i" -le 10 ]; do 
     cp tocopyfile "$directory/file$i" & 
     i=$((i+1)) 
    done 
done 
+0

感謝を取得します。かなり役に立つ – joebegborg07

1

あなたはこのようなあなたのwhileの各反復時に$i == 0こと、$i内部forループを初期化する必要があります:あなたが変更する場合があります

dir=`pwd` 
for directory in `ls $dir`;do 
    i="0" # <===== notice the change here 
    while [ $i -le 10 ] 
    do 
    cp tocopyfile $directory/file$i & 
    i=$[$i+1] 
    done 
done 

他のもの:

  1. 二重引用符すべての変数(その中にスペースが入っている場合)
  2. 長く陳腐化したバックティック構文の代わりに$()を使用してください。
  3. 廃止予定の$[]構文の代わりに$(())を使用してください。
  4. インデントを整理します。
+1

感謝:)そのため – joebegborg07

関連する問題