2011-11-04 60 views
2

我想编译一个大项目,这涉及到我去不同的目录和编译的东西。 我有三个数组,它们都包含命令,第一个数组包含目录遍历,第二个数组包含编译命令,第三个数组包含错误消息。循环数组并执行存储在变量中的命令

设置我的阵列,像这样

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[@]}"对我不起作用,因为我有三个变量。任何人都有任何见解如何解决这个问题?

感谢任何人都可以提供帮助。 :)

回答

4

task数组的大小是${#task[@]}(可爱的语法,eh?)。因此,作为

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

for命令,并在bash(1)的详细信息,算术求的部分你就可以开始你的循环。

+0

非常感谢你,这正是我想要的!完美地工作。谢谢! – Quillion

+1

另一种方法是对于$ {!任务[@]}中的我“; do ...; done' – potong

+0

好的!所有这些都在bash(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 
+0

我很害怕你会这样说,因为我想要一个好看的循环来为我做我的事情。但是非常感谢你,这非常好。 – Quillion

+0

@安德鲁舒尔曼的回答看起来不错,我会承认我并不知道你可以像bash那样编写循环。 –

0

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

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

不够花哨?行:

die() { echo "$*" >&2; exit 1; } 
run() { "[email protected]" || die "Failed (exit $?) at $*"; } 
run make -C vssl/make clean all 
run make -C ../../web/make/ clean install 
相关问题