Видео ролики бесплатно онлайн

Смотреть русский видео

Официальный сайт aksakal 24/7/365

Смотреть видео бесплатно

WeLinux.ru

10.02.09 01:58zb

Скрипты на bashПодводные камни в циклах bash

Сегодня я хотел бы рассказать о возможных подводных камнях и их обходе при написании скриптов на bash.

while;do : ;done
обычно я использую цикл while в случае когда требуется обработка строк разделенных пробелами (в отличии от for, см. ниже)
но это не единственное различие for и while в bash. приведу простой пример

1
2
3
4
5
6
7
echo -e 'test test\ntest2\ntest3  test3'|
 while read a ;do
   echo ==$a
   exit
   done
echo "the script finished $a"
 

Здесь я хотел бы обратить внимание на то, как распределятся процессы при выполнении кода, ветки основного процесса я помечу курсивом, а ветки потомка выделю жирным

echo -e 'test test\ntest2\ntest3 test3'|
while read a ;do
echo ==$a
exit
done

echo "the script finished $a"

таким образом становится понятно, что цикл выйдет напечатав
test test
, но переменная $a останется необновленной, к тому же exit в конце выйдет всего-лишь из цикла. поэтому последняя строка вывода будет
the script finished
попробуем написать скрипт основаный на while, который напечатает все строки а в конце получит в управление переменную заданную в теле цикла., так-же выведет было ли выполнение цикла вообще.

все гораздо проще чем кажется мы просто перенесем echo в дочерний процесс избавившись от перенаправления через pipe:
while read a ;do
echo ==$a
flag=1
done < <(
echo -e 'test test\ntest2\ntest3 test3')
if [ $flag ] ;then echo "the script finished, loop completed $a" else
echo "the script finished, loop didn't started";
fi
exit 0


2. for a in $list ;do : ;done
часто for удобнее чем while но только в случае когда $list (обычно вывод комманды) не содержит пробелов, или, если нам на это плевать.

тут есть свои приколы, но чет я устал и не могу найти пример, кроме vzctl exec для этого случая.
+5
KerneL10.02.09 06:32# +1
О, спасибо =)
l1feh4ck3r10.02.09 12:09# +2
Даешь еще статьи по программированию в баше )
geloni_el12.02.09 02:51# +0
тут есть функция в избраное??? что то я найти немогу
nvbn12.02.09 03:40# +1
В браузере есть такая функция
exelens12.02.09 09:10# +0
=))) согласен
geloni_el13.02.09 04:02# +0
а я не про браузер
zb12.02.09 15:47# +0
тут на хабре ответ на эту статью был, через переменную $IFS можно менять разделители, но это тоже не всегда подходит, например
while read a b c
for
не очень легко заменяет, да и для однострочников не годится.

Посты Комментарии
Последние посты
    Посты Комментарии
    Последние комментарии
      Посты Комментарии Изменения
      Изменения
        Посты Комментарии Изменения
        Top блогов (все)
        Топ пользователей Топ блогов
        Топ пользователей Топ блогов
        Top пользователей (все)
        Топ пользователей Топ блогов
        В сети: nvbn

        Новенькие: predator, wisecapt, ssddvv, Михайло123, kostrukov
        welinux.ru
        Идея сайта exelens; Движок 0byte, разработчик nvbn; Дизайн - Astramak

        Смотреть онлайн бесплатно

        Онлайн видео бесплатно


        Смотреть русское с разговорами видео

        Online video HD

        Видео скачать на телефон

        Русские фильмы бесплатно

        Full HD video online

        Смотреть видео онлайн

        Смотреть HD видео бесплатно

        School смотреть онлайн