2009-07-13 7 views
1

다른 파일의 내용을 소스로하는 bash 스크립트가 있습니다. 다른 파일의 내용은 실행하고 반환 값을 비교하려는 명령입니다. 명령 중 일부는 세미콜론 (;) 또는 앰퍼샌드 (& &)로 구분 된 여러 명령을 가지고 있으며이 작업을 수행 할 수 없습니다. 그림과 같이이 작업을 위해, 나는 몇 가지 테스트 스크립트를 생성 :BASH 다중 명령 및 재진입 가능 변수

test.conf 테스트

예-1 (이 작품)에 의해 공급되는 파일입니다, 내 출력 차이를 2 초

test.conf

 
    CMD[1]="date" 

test.sh

 
    . test.conf 
    i=2 
    echo "$(${CMD[$i]})" 
    sleep 2 
    echo "$(${CMD[$i]})" 

예-2 (이 작동하지 않습니다) 예-3 (이 시도, 그 중 하나가 작동하지 않습니다) test.conf (위와 같은 스크립트)

 
    CMD[1]="date;date" 

test.conf (위와 같은 스크립트)

 
    CMD[1]="date && date" 

내가 돈 ' 내 변수 CMD가 눈금 안에 들어가기를 원한다. 왜냐하면 명령은 소스 호출시 실행되고 변수를 다시 평가할 방법이 없기 때문이다.

이 스크립트는 기본적으로 pass-1에서 무언가를 검사하기 위해 무언가를 검사하기 위해 CMD를 호출합니다. 잘못된 판독 값을 얻으면 스크립트에서 잘못된 값을 수정하고 다시 실행합니다. & 출력을 재평가합니다 CMD의; 패스 -2.

다음은 예입니다. SSHD가 실행 중인지 확인하려고합니다. 1 단계에서 CMD [1]을 평가할 때 실행 중이 지 않으면 다시 시작하고 CMD [1]을 다시 평가합니다. 참고 : 마크가 표시되지 않는 진드기하지만 내 키보드의 ~ 표시 아래의 열쇠 내 테스트 스크립트에 대한이를 수정하면 test.conf

 
    CMD[1]=`pgrep -u root -d , sshd 1>/dev/null; echo $?` 

그래서, 다음 test.conf이된다 . 이

 
    . test.conf 
    i=2 
    echo "${CMD[$i]}" 
    sleep 2 
    echo "${CMD[$i]}" 

내가 2 초 지연에도 불구하고 두 번 인쇄 같은 날짜/시간을 얻을 (눈금을 처리하기 위해)처럼

 
    CMD[1]=`date;date` or `date && date` 

내 스크립트 보인다. 따라서 CMD는 다시 평가되지 않습니다.

원본에 역 따옴표를
#!/bin/bash 

while read -r line; do 
    # munge $line 
    if eval "$line"; then 
     # success 
    else 
     # fail 
    fi 
done 

, 당신이 너무 일찍 그들을 평가 피하기 위해 그들을 탈출해야합니다 :

질문의 라인의 몇에서
+1

귀하의 질문은 명확하지 않다 - 사실, 내가 질문을 볼 수 없습니다. 정확히 무엇을하려는 것입니까? 그리고 어디에서 잘못 될까요? 귀하의 "예", "test.conf CMD [1] = pgrep -u"... "소스 파일"은 어디에 소중합니까? 논증을 어떻게 파싱합니까? 제가보기에 당신은 따옴표가 빠져 있습니까? –

+0

이것은 실제 스크립트가 아니라 테스트 스크립트입니다. 그러므로 $ i가 아직 거기에있다 (컷 - 앤 - 과거) 이유는 명확하지 않다. CMD [x] 여기서 x = 0 ... 10은 1 또는 0을 반환하는 테스트 조건입니다. 대부분 위에서 언급 한 pgrep 예제와 유사하거나 유사하지 않은 프로세스입니다. CMD와 함께 내가 호출 한 해당 RESTART [x]를 가지고 있으며 호출 한 후에 CMD [x]를 재평가하여 프로세스가 다시 시작되었는지 확인합니다. 다른 예제에서는 로그 파일이 있는지 확인하고 있습니다. 나는이 세부 사항을 가진 공개 토론을 지루하게하고 싶지 않았다 그러나 아마 도움이되었을 것입니다. 감사합니다. – Eric

답변

1

첫째, 오래된 쉘과 호환 될 필요가없는 당신이 역 따옴표를 사용해서는 안 이는 $() - 및 그 다음에만을 지원하지 않습니다.

두 번째로 CMD[1]을 설정하는 이유를 이해하지 못하지만 CMD[$i]i으로 설정하면 2으로 설정됩니다.

어쨌든, 이것은 하나의 방법이다 (그리고 배리의 대답의 일부 유사) :

CMD[1]='$(date;date)' # no backticks (remember - they carry Lime disease) 
eval echo "${CMD[1]}" # or $i instead of 1 
+0

이것은 또한 작동합니다. 나는이 방법을 생각하지 않았다. 훌륭 해요, 고맙습니다! – Eric

1

,이 같은 몇 가지 방법이 예상 한 것 . 또한 코드를 평가하는 유일한 방법은 백틱 (backticks)이 아니며 위에 표시된 것처럼 eval입니다. 아마 eval을 (를) 찾고 계셨습니까?예를 들어

,이 라인 :

CMD[1]=`pgrep -u root -d , sshd 1>/dev/null; echo $?` 

는 아마 다음과 같이해야하는 것이 아닌가 : 모든

CMD[1]='`pgrep -u root -d , sshd 1>/dev/null; echo $?`' 
+0

이 작품! 그러나, 내 의견과 이전의 의견 (우리는 동의한다)마다 나는 거기에 진드기가없는 것을 원하지 않는다. 이 스크립트는 Linux 이외의 다른 환경에서는 사용할 수 없으며 BASH를 제어 할 수 없으며 이동성 문제에 동의합니다! – Eric