スクリプトのステートメントでは、条件がif
aを使用しているのを見ますが、$
その理由を理解できません。
if $( ssh user@host " test -e file " ); then
echo "File is there"
else
echo "We don't that file on that host"
fi
答え1
$(...)
コマンドの置換です。シェルは埋め込みコマンドを実行し、式はコマンドの標準出力に置き換えられます。
通常、代替テキストにシェルが後で実行できるコマンドの名前が指定されていない場合、エラーが生成されます。ただし、test
出力は生成されないため、結果はシェルが「スキップする」空の文字列です。たとえば、次を実行するとどうなるか考えてみましょう。
if $( ssh user@host " echo foo " ); then
echo "File is there"
else
echo "We don't that file on that host"
fi
与えられたコードは、不要なコマンドの置き換えなしで正しく書かれています。if
ステートメントに必要な唯一のものは、コマンドの終了状態です。
if ssh user@host "test -e file"; then
echo "File is there"
else
echo "We don't that file on that host"
fi
答え2
この$( ... )
設定はコマンドを実行し、コマンドの終了ステータスと出力を文字列として返します。これはbacktickの最新バージョンです`...`
。
次のように使用できます。my_id=$(id)
ただし、公開したコードスニペットは破損したコードです。ssh user@host "test -f file"
リモートホスト上のファイルの存在に基づいてブール値を返すように見える結果を使用します。残念ながら、それssh
自体が失敗する可能性があることは考慮しません。
if $(ssh -q localhost true); then echo YES; else echo NO; fi
YES
if $(ssh -q localhost false); then echo YES; else echo NO; fi
NO
if $(ssh -q nowhere true); then echo YES; else echo NO; fi
ssh: Could not resolve hostname nowhere: Name or service not known
NO
たぶんこれは意図的な行動かもしれませんが、それは疑わしいです。
さらに$( ... )
、重複しているので、条件を直接的に表現することができます。
if ssh -q user@host "test -e file"; then
echo "File is there"
else
echo "We don't [see] that file on that host [or the ssh failed]"
fi