2017-12-11 1 views
0

나는 파일에 스크립트를 호출해야하는 시험 연습 문제에 대해 연구 중이다. 종료 상태가 0이 아닌 경우 실패 수를 1 씩 증가시키고, 그렇지 않으면 sum 변수를 1 씩 증가시킵니다. 우리가 실제로이 스크립트를 가지고 있지 않기 때문에, 나는 우리가 호출하고있는 스크립트가 compute라고 가정하고 args가 모든 파일 인수라고 가정하고, 내가 종이에 쓴 것을 정확하고 싶다.이 스크립트는 (파일을 반복 실행하고, 다른 스크립트에 인수로 전달하고, 실패를 계산하고, 성공적인 출력을 합산하기 위해) 올바르게 작성 되었습니까?

SUM=0 
NUMFAILS=0 
SCRIPT=./$compute 

for args in *; do 
    num=$SCRIPT args 
    if (($? -ne 0)); then 
     NUMFAILS++ 
    else 
     SUM=(($SUM+$num)) 
    fi 
done 
+0

제목 슈를 사용 shellcheck 0

  • 같은 경우 선행 증가 ((++numfails))((sum+=num)) || trueset -e 스크립트를 종료 할 경우를 처리하는 데 사용한다 uld는 실제 질문 자체를 반영하는 것이지 문제에 관한 것이 아닙니다. –

  • +0

    ... btw, 일반적으로이 문제를 해결하는 올바른 방법은 필요한 계산과 합리적인 방법으로 작동하는 테스트 스크립트를 작성하는 것입니다. 해당 스크립트의 특정 문제를 격리하고 초점을 맞추지 않는 스크립트에 대한 질문은 명시 적으로 주제를 벗어나지 않은 경우 여기에서 눈살을 찌푸리게하는 경향이 있습니다. –

    답변

    2
    sum=0 
    numfails=0 
    
    shopt -s nullglob 
    
    for args in *; do 
        if num=$(./compute "$args"); then 
         ((sum+=num)) 
        else 
         ((numfails++)) 
        fi 
    done 
    
    • 당신은 마지막 명령의 테스트 종료 상태에 대한 $?를 사용하거나 직접 if로 테스트 할 수 있습니다 : 테스트하는 동안 if command; then echo CMD OK; fi
    • 당신은 변수에 명령의 출력을 할당 할 수는 종료 코드 :
      if output=$(command); then echo CMD OK; fi
    • do 은 대문자 변수를 환경 및 내부 셸 변수와 충돌시킬 수 있으므로 사용합니다. 레
    • 변수 명령을 저장하는 것이 현명되지 않습니다 : BashFAQ #50
    • NUMFAILS++ : ((numfails++))
    • num=$SCRIPT args : 당신이 명령의 출력을 대체 명령 대체를 사용할 필요가 여전히 식을 평가하기 위해 ((를 사용할 필요가 : num=$(./script "$args")
    • args이 변수 인 경우 달러 기호 ("$args")로 확장해야합니다. 따옴표는 단어 분리를 방지하는 데 필요합니다. 예를 ((++numfails))를 들어, 당신은 @ CharlesDuffy의 제안에 디렉토리
    • 을에는 파일이없는 경우 경우, for 루프를 건너 shopt -s nullglob을 사용할 수 있습니다 달러 기호
    • 를 사용할 필요가 없습니다, 산술 맥락에서 그 주 당신이 set -e 사용하고, 당신은 산술 식 중 하나의 결과가
    +0

    대신에'((++ numfails))'preincrement를 만들 수 있습니다 - 첫 번째 실행에서'set -e'로 실패하지 않게하십시오. 여러분은 어쨌든'set -e'를 사용해야합니다. :) –

    +0

    @CharlesDuffy 좋은 지적, 감사합니다! 불행하게도, 만약 첫번째 num이 0이라면, 그것은 또한 set -e로 실패 할 것이다. – PesaThe

    +0

    ㅎ - 좋은 지적입니다. 이 경우를 처리하기 위해'((sum + = num)) || :'해야 할 수도 있습니다. –

    관련 문제