2015-09-14 2 views
-1

Я новичок в программировании bash, и мне было интересно, как выйти из цикла bash, как только это будет выполнено с помощью операторов.Как сделать bash для выхода петли?

Я пытаюсь создать скрипт 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 * exit после последней итерации. Что именно вы видите? – chepner

+1

Я рекомендую вам избегать использования ваших трубопроводов. Он может порождать больше процессов, чем вы, вероятно, должны обрабатывать, и затрудняет отладки вещей. То, что * выглядит * как '.18', является последней обработанной обработкой, может быть просто' .18', являющейся строкой списка для * завершения * обработки. Посмотрите, работает ли скрипт без '&' в конце труб. Кроме того, исследуйте ['fping'] (http://fping.org/) в качестве альтернативы; он, вероятно, доступен для вашего дистрибутива Linux. – ghoti

ответ

1

C-стиль для петель необходимо использовать двойные скобки в Баш

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

Это происходит потому, что Баш необходим специальный синтаксис для арифметических операций.

Refs: for, Conditional Constructs (прокрутите вниз немного для ((...)))

+0

Да. im, используя двойную скобку .. но im все еще ожидает ответа от tripleee на то, почему скобка была удалена, потому что она бросает мне синтаксическую ошибку. – Krishna

+0

Он просто достал ваш код из пастихинов, где у вас нет двойных парен. –

2

Начинают большое количество фоновых процессов внутри петель. Они продолжают работать даже после завершения цикла.

Можно ли предположить, что вы положили & туда специально? Если вы не хотите, чтобы задания выполнялись в фоновом режиме, вытащите их.

Как бы то ни было, неудачные процессы ping должны завершиться через несколько секунд, возможно, минутные вершины (в зависимости от версии ping и несколько в вашей сети).

+0

Да, это было специально для того, чтобы я мог ускорить работу скрипта ... если я удалю его, он отлично работает, как и ожидалось. И вы можете предложить мне, как улучшить скрипт, который я написал для лучшей производительности. Это был пример кода. если бы я должен был делать то же самое на очень большом количестве хостов, код будет хватать много времени для завершения. Есть ли какой-нибудь другой метод, который я могу посмотреть? – Krishna

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