파일이 있는지 테스트하려고합니다 $SSHPATH/$ID.*
. sshpass
비밀번호를 입력하지 않아도 되도록 비밀번호를 제공하는 데 사용합니다 .
파일이 존재하지 않으면 코드를 실행하고 싶습니다
if [ "sshpass -p $SSHPASS ssh root@$SSHHOST test ! -f $SSHPATH/$ID.*" ]; then
파일이 원격 서버에 존재하더라도 true를 반환하는 것 같습니다. 왜?
중복은 아닌거 같은데명령이 성공하거나 실패할 경우 조건부로 작업을 수행하는 방법이것도 작동하지 않기 때문에 파일이 존재하지 않으면 실행되지 않습니다.
if sshpass -p "$SSHPASS" ssh "root@$SSHHOST" test ! -f "$SSHPATH/$ID.*"; then
답변1
pLumo가 설명하듯이, 테스트는 항상 성공합니다.
당신이 원하는 것은 당신의 패턴이 $SSHPATH/$ID.*
어떤 것으로 확장될 수 있는지 테스트하는 것입니다. 패턴이 여러 이름으로 확장될 수 있고 테스트는 단일 경로 이름에만 적용될 수 있으므로 이는 -f
일반 파일에 대한 테스트와 다릅니다 .-f
로컬에서는 다음 명령을 사용하여 이 작업을 수행할 수 있습니다.
set -- "$SSHPATH/$ID".*
if [ -e "$1" ]; then ...; fi
이는 위치 매개변수( 등)를 주어진 패턴과 일치하는 이름 $1
으로 설정합니다 . 그런 다음 이러한 문은 첫 번째 일치 항목이 기존 이름인지 테스트합니다(패턴이 일치하는 항목이 없으면 대부분의 셸에서 확장되지 않은 상태로 유지됩니다).$2
set
if
이것을 실행하려면 ssh
:
ssh user@host "set -- '$SSHPATH/$ID'.*; [ -e \"\$1\" ]"
불안정한 기준은 이를 보장하고 $SSHPATH
확장 $ID
됩니다.현지의쉘 및 "$1"
원격 확장.
ssh
패턴이 기존 이름과 일치하면 종료 상태는 0("성공")이고, 일치하지 않거나 어떤 방식으로든 실패하면 종료 상태는 0이 아닙니다("실패").
if
다음과 같은 선언에서 사용할 수 있습니다.
if ssh user@host "set -- '$SSHPATH/$ID'.*; [ -e \"\$1\" ]"; then
# do something for success
else
# do something for failure
fi
시험아니요- 존재, 음성 테스트:
if ssh user@host "set -- '$SSHPATH/$ID'.*; [ ! -e \"\$1\" ]"; then
# do something for failure
else
# do something for success
fi
나는 당신의 사용을 간과했지만 sshpass
아마도 ssh
질문에서했던 것처럼 접두사를 붙일 수 있습니다.
답변2
첫 번째 명령은 동일합니다
if [ "some string" ]; then ... fi
이것은 항상 사실입니다.
두 번째 명령은 거의 정확하지만 내부 따옴표를 추가하거나 이스케이프해야 합니다. !
그렇지 않으면 쉘에서 해석됩니다.
경로의 특수 문자 문제를 방지하려면 전체 명령을 큰따옴표로 묶고 경로를 작은따옴표로 묶으십시오. *
작은따옴표 밖에 다음이 있는지 확인하세요 .
if sshpass -p "$SSHPASS" ssh root@$SSHHOST "test ! -f '$SSHPATH/$ID.'*"; then ... fi
패턴이 여러 파일과 일치하는 경우테스트는 실패할 것이다.