循环遍历数组并执行存储在变量中的命令

时间:2011-11-04 13:26:48

标签: bash unix

我正在尝试编译一个大项目,这涉及到我去不同的目录并在那里编译东西。 我有三个数组,所有数组都包含命令,第一个数组包含目录遍历,第二个数组包含编译命令,第三个数组包含错误信息。

我设置了我的数组

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 个答案:

答案 0 :(得分:4)

task数组的大小为${#task[@]}(可爱的语法,嗯?)。所以你可以开始你的循环

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

有关详细信息,请参阅for命令和bash(1)中关于算术评估的部分。

答案 1 :(得分:2)

您可以随时计算$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

答案 2 :(得分:0)

为什么世界上你有三个阵列? Shell对于编程来说并不是那么棒,但它对于运行命令非常有用,这就是你在这里所做的。所以,就这样做:

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

不够花哨? OK:

die() { echo "$*" >&2; exit 1; }
run() { "$@" || die "Failed (exit $?) at $*"; }
run make -C vssl/make clean all
run make -C ../../web/make/ clean install