다른 파일의 내용을 소스로하는 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
, 당신이 너무 일찍 그들을 평가 피하기 위해 그들을 탈출해야합니다 :
질문의 라인의 몇에서
귀하의 질문은 명확하지 않다 - 사실, 내가 질문을 볼 수 없습니다. 정확히 무엇을하려는 것입니까? 그리고 어디에서 잘못 될까요? 귀하의 "예", "test.conf CMD [1] = pgrep -u"... "소스 파일"은 어디에 소중합니까? 논증을 어떻게 파싱합니까? 제가보기에 당신은 따옴표가 빠져 있습니까? –
이것은 실제 스크립트가 아니라 테스트 스크립트입니다. 그러므로 $ i가 아직 거기에있다 (컷 - 앤 - 과거) 이유는 명확하지 않다. CMD [x] 여기서 x = 0 ... 10은 1 또는 0을 반환하는 테스트 조건입니다. 대부분 위에서 언급 한 pgrep 예제와 유사하거나 유사하지 않은 프로세스입니다. CMD와 함께 내가 호출 한 해당 RESTART [x]를 가지고 있으며 호출 한 후에 CMD [x]를 재평가하여 프로세스가 다시 시작되었는지 확인합니다. 다른 예제에서는 로그 파일이 있는지 확인하고 있습니다. 나는이 세부 사항을 가진 공개 토론을 지루하게하고 싶지 않았다 그러나 아마 도움이되었을 것입니다. 감사합니다. – Eric