2015-09-14 107 views
-1

我是新來的bash編程,我想知道如何從bash循環中退出,一旦它完成執行語句。如何使bash for循環退出?

我想創建一個ping腳本,它的工作原理..但腳本不會退出。假設最後一個主機地址是192.168.42.18 ..之後腳本不會退出。它只是試圖迭代。

正如我所說的伊爾姆新,所以我對我的noobness的xD

我曾嘗試2種方法和這兩種方法在語句得到執行後不退出最終遺憾。

方法1種

for ((x=42;x<=43;x++)) 
do 
    for ((y=1;y<=20;y++)) 
    do 
     ping -c 1 192.168.$x.$y | grep "bytes from" |cut -d " " -f 4|cut -d":" -f 1 & 
    done 
done 

方法2

#!/bin/bash 
for n in {42..43} 
do 
    for h in {1..100} 
    do 
     ping -c 1 192.168.$n.$h | grep "bytes from" |cut -d " " -f4 | cut -d ":" -f1 & 
    done 
done 

請揭示應該怎麼繼續進行一些光。

+0

最後地址是43.20,爲什麼你認爲它應該是42.18?循環終止的條件是什麼? – karakfa

+0

目前尚不清楚你的問題是什麼。對於循環* do *在最後一次迭代之後退出。你究竟看到了什麼? – chepner

+1

我建議你避免背景你的管道。它有可能產生比你應該處理的更多的進程,並且很難調試。看起來像'.18'是最後一行處理可能只是'.18'作爲*完成*處理的列表行。查看腳本是否在管道末尾沒有'&'的情況下運行。另外,請研究['fping'](http://fping.org/)作爲替代方案;它可能適用於您的Linux發行版。 – ghoti

回答

1

C風格的for循環需要在bash

for ((x=42;x<=43;x++)) 

這是因爲bash的需要特殊的語法算術運算使用括號。

參考文獻:forConditional Constructs(向下滾動位爲((...))

+0

是的。即時通訊使用雙括號..但即時通訊仍然在等待爲什麼括號被刪除,因爲它引發了我的語法錯誤來自tripleee的迴應。 – Krishna

+0

他只是將你的代碼從pastebins中提取出來,在那裏你沒有雙重parens。 –

2

你開始有大量的循環中後臺進程。即使在循環結束後它們仍繼續運行。

我們可以假設您將&故意放在那裏嗎?如果你不想讓作業在後臺運行,請將其取出。

實際上,失敗的ping過程應該在幾秒內完成,也許是一分鐘的上限(具體取決於ping的版本以及您的網絡)。

+0

是的,這是有目的的,所以我可以加快腳本......如果我刪除&它工作正常,如預期的那樣。你能建議我如何改進我寫的更好的性能腳本。這是一個示例代碼。如果我必須在大量的主機上執行相同的操作,代碼將花費很多時間來完成......是否還有其他方法可以使用? – Krishna