2011-11-04 2 views
2

큰 프로젝트를 컴파일하려고하는데, 다른 디렉토리로 이동하여 거기에 컴파일하는 작업이 포함됩니다. 배열이 세 개 있습니다. 모두 명령을 포함하고 있습니다. 첫 번째 배열에는 디렉터리 순회가 포함되고 두 번째 배열에는 컴파일 명령이 포함되며 세 번째 배열에는 오류 메시지가 포함됩니다.배열을 반복하고 변수에 저장된 명령을 실행하십시오.

나는 이제 내가 많은 것들을 시도하고 달성하는 방법을 잘하지 않은 루프에 대한 즉,이

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 

처럼 작동해야합니다 그래서

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 i in "${task[@]}"은 세 가지 변수가 있기 때문에 나를 위해 작동하지 않습니다. 누구든지이 문제를 해결하는 방법에 대한 통찰력을 갖고 있습니까?

도움을 주실 수있는 분들께 감사드립니다. :)

답변

4

task 배열의 크기는 ${#task[@]} (멋진 구문, 예?)입니다.

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

for 명령 및 자세한 내용은 bash는 (1) 산술 평가에 대한 섹션을 참조하십시오 그래서 당신은 당신의 루프를 시작할 수 있습니다.

+0

정말 고마워요. 제가 원한 것입니다! 완벽하게 작동합니다. 고맙습니다! – Quillion

+1

대안은'for i '$ {! task [@]} "; 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

@AndrewSchulman의 답변도 좋습니다. 나는 bash에있는 사람들처럼 for-loops를 작성할 수 있다는 것을 모르고 있었다고 고백 할 것이다. –

0

왜 세계에서 세 가지 배열을해야합니까? 쉘은 프로그래밍에별로 좋지는 않지만 커맨드를 실행하기에 좋습니다. 이것은 당신이 여기에서하는 것처럼 보입니다. 그럼, 그냥 :

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

충분하지 않다? 확인 :

관련 문제