bash
다음은 원격 시스템에서 ssh 명령을 실행하려고 시도하는 Until 루프 스크립트입니다 .
n=0
until [ ${n} -ge 5 ]
do
ssh -oStrictHostKeyChecking=no root@test "mkdir -p /test_dir" && break
n=$(($n+1))
sleep 5
done
루프가 성공하지 못한 채 종료되면 종료 1이 실행되기를 원합니다.
나는 이 해결책을 찾았습니다:
n=0
until [ ${n} -ge 5 ]
do
ssh -oStrictHostKeyChecking=no root@test "mkdir -p /test_dir" && exit 0
n=$(($n+1))
sleep 5
done
exit 1
올바른 방법인가요?
답변1
이것은 한 가지 방법입니다.
또 다른 방법은 다음과 같습니다.
until [ "$n" -ge 5 ] && exit 1; do
... && break
done
echo OK
exit 0
또는:
while [ "$n" -lt 5 ] || exit; do
... && break
done
ssh
여기서는 성공할 때까지 명령을 반복하고 여러 번 시도한 후에 중단 하려는 것처럼 보이지만 다음과 같습니다.
n=5
until
ssh -oStrictHostKeyChecking=no root@test "mkdir -p /test_dir"
do
n=$((n - 1))
if [ "$n" -eq 0 ]; then
echo >&2 giving up
exit 1
fi
done
echo OK
exit 0
더 이해가 될 것입니다.
답변2
"실패"로 끝나는 루프를 루프를 완료하는 루프로 분류하면 그렇습니다. 그런 일이 발생하면 종료 코드는 1이 됩니다.
방금 작성한 스크립트는 종료 코드 1로 끝났습니다. 영원히 반복되면 분명히 종료 코드 1을 얻지 못할 것입니다.
모든 종료 코드는 실행한 마지막 명령이 성공했는지 여부를 알려주는 것뿐입니다.
게시물의 스크립트가 루프를 완료하고 종료되면 즉시 다음 명령을 실행해 보세요.
echo $?
그런 다음 다시 실행하십시오 echo $?
. 무엇이 보이나요? 왜 변했다고 생각하시나요? 아마 지금쯤 이해했을 것입니다. 명령을 성공적으로 실행했다는 사실(이 경우에는 echo
거의 모든 명령일 수 있음)이 종료 상태를 0으로 변경합니다.