我正在尝试编译一个大项目,这涉及到我去不同的目录并在那里编译东西。 我有三个数组,所有数组都包含命令,第一个数组包含目录遍历,第二个数组包含编译命令,第三个数组包含错误信息。
我设置了我的数组
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[@]}"
对我不起作用,因为我有三个变量。有没有人对如何解决这个问题有任何见解?
感谢任何可以提供帮助的人。 :)
答案 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