LINUX.ORG.RU

[Bash] Скриптописание.

 


0

1

Как сделать так, чтобы в результате условия действие выполнилось один раз, а не зацикливалось, пока действительны условия цикла, не разрывая цикл?

if чего-то там; then
   сделать чего-то
fi


Ответ на: комментарий от o
член=стоит
while :;do
    if [ $член == "стоит" ]; then
        echo 'Это здорово!'
    fi
done

Он будет зацикленно выводить сообщение. Как сделать так, чтобы это произошло только один раз.

Phaser
() автор топика
Ответ на: комментарий от uzbl

Насколько я понял, ему брейк не нужен.

sin_a ★★★★★
()
Ответ на: комментарий от Phaser

Тогда добавь флаг (переменную), и выставляй его по выполнению условия.

uzbl
()
Ответ на: комментарий от sin_a

> Задай а=0 и добавь проверку: если а=0 то эхо «член стоит и это хорошо» и а=а+1, а если а!=0 то забить.
Я так и сделал. Думал, может, попроще есть.
Break разве не завершает скрипт?

Phaser
() автор топика
Ответ на: комментарий от Phaser

Вон выше ещё изящнее показали. Нужно просто положить член.

sin_a ★★★★★
()
Ответ на: комментарий от zolden

Я так сделал. Что-то вроде прерывателя.

Phaser
() автор топика

Акцентуация на стоячем члене, в качестве аватарки - агрессивный spider man. Фрейда сюда!!!

P.S. man

chinarulezzz ★★
()
Ответ на: комментарий от Phaser

>Команда break без параметра прерывает тот цикл, в который она вставлена, а break N прерывает цикл, стоящий на N уровней выше (причем 1-й уровень — это уровень текущего цикла, прим. перев.).
врать не хорошо!
тем более мне
RTFM!

megabaks ★★★★
()
Ответ на: комментарий от encyrtid

Вон, я дал ссылку, смотри выше. Знаю я про статус завершения. И брэйк ломает весь цикл!

Phaser
() автор топика
Ответ на: комментарий от Phaser

Ты хоть сам-то понял, что сказал?

да

#!/bin/bash
while true;do
  echo "начало"
  break
  echo "конец"
done
echo "break завершил только цикл! Phaser, RTFM!"
[ megabaks@desktop ] ~ $ sh scripts/Phaser-лжец/pruff
начало
break завершил только цикл! Phaser, RTFM!
[ megabaks@desktop ] ~ $ 

megabaks ★★★★
()
Ответ на: комментарий от Phaser

он намекает что break заканчивает цикл, а у тебя, кретин, скрипт такого вида:

while :;
 ... 
done;

ну и если break заканчивает цикл, то что будет делай твой скрипт если его логика целиком в цикле? Так что ты хотя бы обдумывай что тебе пишут, прежде чем отвечать в быдло-манере, ушлёпок. Целую. чмоки-чмоки ;)

chinarulezzz ★★
()
Ответ на: комментарий от megabaks

Кукнулся? Слово конец он не печатает. Потому что прерывает while. А если это встроить во вложенный циклы, он завершит весь скрипт после break.

Phaser
() автор топика

Похоже вы не поняли условия задачи.

Phaser
() автор топика
Ответ на: комментарий от Phaser

С твоими членами очень страшно на ссылку нажимать.

Tanger ★★★★★
()
Ответ на: комментарий от Phaser
#!/bin/bash
while true;do
	while true;do
	  echo "начало вложенного цикла"
	  break
	  echo "конец вложенного цикла"
	done
  echo "цикл продолжил работу, даже после break-а вложенного цикла"
  echo "опять лжёшь,Phaser!"
  break
done
echo "break завершил только один цикл! Phaser, RTFM!"
[ megabaks@desktop ] ~ $ sh scripts/Phaser-лжец/pruff
начало вложенного цикла
цикл продолжил работу, даже после break-а вложенного цикла
опять лжёшь,Phaser!
break завершил только один цикл! Phaser, RTFM!
[ megabaks@desktop ] ~ $ 
megabaks ★★★★
()
Ответ на: комментарий от encyrtid
while :;do
  if [ чего-то там ];then
      echo "начало"
      break
  fi
  еще какие-то действия.
done

Мне надо чтобы он завершил if. А он и while тоже брейканет.

Phaser
() автор топика
Ответ на: комментарий от megabaks
#!/bin/bash
while true;do
   while true;do
     echo "начало вложенного цикла"
     break
     echo "конец вложенного цикла"
   done
  echo "цикл продолжил работу, даже после break-а вложенного цикла"
  echo "опять лжёшь,Phaser!"
done

Но он же будет возвращаться ко вложенному и по-новой его выполнять. А мне это не надо.

Phaser
() автор топика
Ответ на: комментарий от megabaks

Давай так:

while :;do
   echo 'Сам дурак'
done
Надо чтобы он вывел сообщение ОДИН РАЗ, но НЕ ЗАВЕРШАЛ цикл. Нельзя?

Phaser
() автор топика
Ответ на: комментарий от megabaks

Да я так уже давно сделал. Думал может какой-то командой интерпретатора можно было сварганить. Не поняли мы друг друга.

Phaser
() автор топика
Ответ на: комментарий от Phaser

я отвечал по поводу break only, не!? ;)
а то что ты хочешь...я сам со счётчиками и проверками делаю
как по-другому...хз

megabaks ★★★★
()
Ответ на: комментарий от Phaser

>Думал может какой-то командой интерпретатора можно было сварганить.

if - это не команда интерпретатора?

OramahMaalhur
()
Ответ на: комментарий от megabaks

Разобрались, теперь можно спать спокойно.

Phaser
() автор топика
Ответ на: комментарий от Phaser

> if [ $battery == «10%» ]; then

У тебя будет 11%, ты положишь его в s2ram, заберёшь оттуда, когда будет 8%, и это условие не выполнется, поэтому батарейка сдохнет и ноут аварийно выключится чуть быстрее, чем он это делает с systemd. Поэтому надо написать:

if [ «${battery%\%}» -le 10 ]; then

gentoo_root ★★★★★
()
Ответ на: комментарий от Phaser

> Мне надо чтобы он завершил if.

Ну ты сострил на ночь глядя.

anonymous
()

сдвиг по фазеру. имхо, тс надо на бейсике написать, через goto выпрыгнуть со всех циклов, словно дартаньян.

i_hate_black_lor_gui
()
Ответ на: комментарий от anonymous

В качестве аргументов:

1. дерзкое общение

2. глупость

3. скидывание своей глупости на других

p.s.

по скрипту - можно было не выёживаться с циклами и просто повесить скрипт на watch, например.

по внутренностям скрипта: полнейший overkill и не знание инструментов, sed и awk тут не нужны, раз уж используешь именно баш, используй [[ ну и т.д.

anonymous
()
Ответ на: комментарий от anonymous

Ты че, урод. Как хочу так и пишу. Тебя вообще не звали. Онанизмус.

Phaser
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.