Estou tentando testar se $SSHPATH/$ID.*
existe um arquivo. Estou usando sshpass
para fornecer uma senha para não precisar digitar.
Eu quero executar um código se o arquivo não existir
if [ "sshpass -p $SSHPASS ssh root@$SSHHOST test ! -f $SSHPATH/$ID.*" ]; then
Isso parece retornar true mesmo se o arquivo existir no servidor remoto. Por quê?
Eu não acho que seja uma duplicata de Como fazer algo condicionalmente se um comando foi bem-sucedido ou falhou porque isso também não funciona, não foi executado se o arquivo não existir
if sshpass -p "$SSHPASS" ssh "root@$SSHHOST" test ! -f "$SSHPATH/$ID.*"; then
Como o pLumo explicou , seu teste sempre será bem-sucedido.
O que você quer fazer é testar se seu padrão,
$SSHPATH/$ID.*
, se expande para algo. Isso é diferente de testar-f
se é um arquivo normal, pois o padrão pode se expandir para vários nomes e o-f
teste só pode ser aplicado a um único nome de caminho.Localmente, você pode fazer isso com
Isso definiria os parâmetros posicionais (
$1
,$2
, etc.) para os nomes correspondentes ao padrão fornecido aset
. Asif
instruções então testam se a primeira correspondência é um nome existente (o padrão permaneceria não expandido na maioria dos shells se não correspondesse a nada).Para executar isso
ssh
:A citação instável garante que o
$SSHPATH
and$ID
seja expandido pelo shell local"$1"
, enquanto é expandido remotamente.Isso lhe daria um status de saída zero ("sucesso") se o padrão correspondesse a um nome existente e diferente de zero ("falha") se não correspondesse (ou se
ssh
falhou de alguma maneira).Você pode usar isso em uma
if
declaração assim:Para testar a inexistência , negue o teste:
Eu ignorei seu uso de
sshpass
, mas você pode apenas prefixar ossh
como fez na pergunta.Seu primeiro comando é o mesmo que
que sempre será verdade.
O segundo comando está quase certo, mas você precisa colocar as
!
aspas internas ou escapá-lo, caso contrário ele será interpretado pelo seu shell.Aspas duplas em todo o comando e aspas simples no caminho para evitar problemas com caracteres especiais dentro do caminho. Certifique-se de ter
*
fora das aspas simples:Se o seu padrão corresponder a vários arquivos, o teste falhará .