ファイルがあるかどうかをテストしようとしています$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
これは常に本当です。
2番目のコマンドはほぼ正確ですが、内部引用符を追加またはエスケープする必要があります。!
それ以外の場合はシェルで解釈されます。
パスの特殊文字の問題を回避するには、コマンド全体を二重引用符で囲み、パスを一重引用符で囲みます。*
一重引用符の外側に以下があることを確認してください。
if sshpass -p "$SSHPASS" ssh root@$SSHHOST "test ! -f '$SSHPATH/$ID.'*"; then ... fi
パターンが複数のファイルと一致する場合テストは失敗します。