Как в баш подсчитать правильно количество шагов в скрипте до их прохождения?

NOW_STEP=0
LAST_STEP='grep "step_start"  | wc -l' ./test.sh

function step_start {  ((NOW_STEP++)) }
Тут какой-то код
function step_end { LAST_STEP=$NOW_STEP}

function step_start {  ((NOW_STEP++)) }
Тут какой-то  еще код
function step_end { LAST_STEP=$NOW_STEP}

У меня есть несколько степов, в каждом скрипте их может быть разное количество.
Нет проблем вызвать что-то вроде ((i++))
Но вот в чем проблема мне нужно знать конечное количество шагов в скрипте в самом начале
для построения прогресс бара 2 из 12.
Пока на ум приходит
grep | wc -l
самого файла но как-то это не правельно, может более адекватный способ ?
  • Вопрос задан
  • 55 просмотров
Пригласить эксперта
Ответы на вопрос 2
@AUser0
Чем больше знаю, тем лучше понимаю, как мало знаю.
Тогда уж grep-уйте NOW_STEP=$((NOW_STEP+1)), столько функций писать нет смысла.
Ответ написан
Комментировать
saboteur_kiev
@saboteur_kiev Куратор тега bash
software engineer
Ну в том виде, в котором у вас скрипт создан, других вариантов и не видно.
Если количество шагов меняется, то grep|wc вполне себе вариант
TOTAL_STEPS=$(grep step_start $0| wc -l )
только не забыть, что сам grep тоже будет +1.

Но если количество шагов у вас не меняется, то просто статику добавить в начало скрипта и все.
Или все зависит от скрипта, от шагов и архитектуры.
Я вот не очень понимаю зачем вы создаете функцию перед и после каждого шага, ее же вызывать надо?
Пример не очень релевантент.

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

steps="initialize build deploy notify"

function initialize() { echo code1; }
function build() { echo code2; }
function deploy() { echo code3; }
function notify() { echo code4; }

echo "We have total $(wc -w<<<"$steps") steps."

for step in $steps; do
  echo "Executing step $step"
  $step
done


Или можно работать с массивом
function initialize() { echo code1; }
function build() { echo code2; }
function deploy() { echo code3; }
function notify() { echo code4; }

steps=( initialize build deploy notify )
echo "We have ${#steps} steps in total"
for step in ${steps[@]}; do
 echo executing $step
 $step
done
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы