2017-06-08 52 views
1

我是一名初學者,開始使用bash腳本。Bash - while for loop not exiting

我在當前工作目錄中有10個目錄dir1-dir10 + script.sh +一個名爲「tocopyfile」的文件。

Dir1-10爲空。 tocopyfile是用於我的訓練 script.sh爲目的的測試文本文件包含以下代碼:

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- 10)命名約定文件#。問題在於腳本存在於第一個目錄之後,而不執行剩餘剩餘的dir的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

需要初始化$ifor循環,使得$i == 0在你的while的每一次迭代:

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. 雙引號所有變量(如果它們中有空格)。使用$()而不是長期棄用的back-tick語法。
  2. 使用$(())而不是已棄用的$[]語法。
  3. 收拾你的縮進。
+1

感謝您的非常有用:) – joebegborg07