четверг, 26 мая 2016 г.

bash - работаем без операторов условий (if / then / else)...

При работе в bash столкнулся с тем, что очень утомительно отслеживать в сложных или больших по обьему скриптах вложенные условия, часто где-то на 4..5 м вложении условия просто уже теряешь мысль - "зачем это делал исходя из предыдущих действий".

Пример типа:

#!/bin/bash
value_in="-1";

if  [[ $value_in < 0 ]]
   then
       if [[ $value_in != 0 ]]
         then
             if [[ $value_in > 0 ]]
               then
                 ...
              else
           fi
         else
         fi
       else
      fi
     .......

или

if [[ $value_in < 0 ]]
  then
  ...
fi

if [[ $value_in != 0 ]]
  then
  ...
fi

if [[ $value_in > 0 ]]
  then
  ...
fi

if [[ $value_in == 0 ]]
  then
  ...
fi

.....


В поиске "той самой" ошибки честно уже становится сложно понять собственно - "где"?..  Вот и решил я эту задачу несколько не стандартно, но очень хорошо читаемо и отслеживаемо.. :)

Пример ниже:

#!/bin/bash
## переменная которую мы проверяем...
value_in="-1";

## массив условий которые будут использованы
iFs=( "$value_in < 0 " "$value_in != 0 " "$value_in > 0 " "$value_in == 5 " );

## массив функций которые в соответсвии с условием обработают Then или Else
logic=( '"a0" "a1"' '"b0" "b1"' '"c0" "c1"' '"d0" "d1"' );

## собственно функции обработчики.
function a0() {
    echo "run - a0";
}

function a1() {
    echo "run - a1";
}

function b0() {
    echo "run - b0";
}

function b1() {
    echo "run - b1";
}

function c0() {
    echo "run - c0";
}

function c1() {
    echo "run - c1";
}

function d0() {
    echo "run - d0";
}

function d1() {
    echo "run - d1";
}

## *****************обработчик событий
function executor() {
if [[ ${#iFs[@]} -eq 0 ]]||[[ ${#iFs[@]} != ${#logic[@]} ]]
    then echo "exit";
         exit 0;
fi
echo "begin";
exfunc=();
for ((lg_index=0; lg_index != ${#iFs[@]}; lg_index++))
 do
    ## !! debug operation...
    echo "execution: function ${iFs[lg_index]}"
    lg=$(echo $((${iFs[$lg_index]})) );
    exfunc=( ${logic[$lg_index]} );
    runfunc=$(echo ${exfunc[$lg]}| sed 's/\"//g');
    $runfunc;
done
}

executor;


Здесь применена технология "мгновенного" перехода по индексу имен функций - которые должны выполнять событие согласно условий.
Проще говоря по результату полученному из бинарной операции - получаем индекс и соответсвенно имя исполняемой функции которая и обработает результат. Данная технология используется мной в разных языках программирования, и блестяще показывает быстродействие!
В некоторых языках программирования момент перехода к сожалению невозможно "перехватить" - поэтому приходится вставлять "сигнализатор" в обработчик события.
Пример на языке bash - просто показывает принцип работы. А вот использовать данную технологию можно практически везде. Всем кто читал спасибо. :)