Проход по массиву и выполнение команды, хранящейся в переменных - PullRequest
2 голосов
/ 04 ноября 2011

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

Я настроил свои массивы примерно так

task[0]="cd vssl/make/; make clean;"
compile[0]="make all"
error[0]="echo \"We failed at vssl install\""

task[1]="cd ../../web/make/; make clean;"
compile[1]="make install"
error[1]="echo \"We failed at web install\""

Теперь мне нужен цикл for, который будет работать следующим образом

for i in {0..$size_of_array}
do
    eval ${task[$i]}
    if (eval ${compile[$i]}); then
        echo "Done"
    else
        eval ${error[$i]}
        break
    fi
done

Я много чего перепробовал, и не уверен, как этого добиться. for i in "${task[@]}" у меня тоже не работает, потому что у меня три переменные. Кто-нибудь может понять, как это обойти?

Спасибо всем, кто может помочь. :)

Ответы [ 3 ]

4 голосов
/ 04 ноября 2011

Размер массива task равен ${#task[@]} (прекрасный синтаксис, а?). Таким образом, вы можете начать свой цикл как

for ((i=0; i<${#task[@]}; ++i))

Подробнее см. Команду for и раздел об арифметической оценке в bash (1).

2 голосов
/ 04 ноября 2011

Вы можете вычислить $i на ходу:

i=0
for cmd in "${task[@]}"; do
  eval $cmd
  if (eval ${compile[$i]}); then
    echo "Done"
  else
    eval ${error[$i]}
    break
  fi
  i=`expr $i + 1`
done
0 голосов
/ 04 ноября 2011

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

set -ex
make -C vssl/make clean all
make -C ../../web/make/ clean install
...

Не достаточно фантазии?ОК:

die() { echo "$*" >&2; exit 1; }
run() { "$@" || die "Failed (exit $?) at $*"; }
run make -C vssl/make clean all
run make -C ../../web/make/ clean install
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...