2017-11-29 25 views
1

SSHを実行してリモートでコマンドを実行しようとしていますが、EOF内で定義されている変数が選択されていません。変数がEOF内で取り込まれない

変数$BASE_PATHは、私が名前で定義している別の変数の中で呼び出されていませんFOLDER_NAME。スクリプト内でも言及されています。 EOFを一重引用符('EOF')で使用することができませんでした。なぜなら、シェルからも変数を使用する必要があるからです。

#!/usr/bin/ksh 

FILE_NAME=$2 
jvm_list=$1 

for jvm in `echo $jvm_list` 
do 

ssh $jvm << EOF 
    echo FILE_NAME=${FILE_NAME} 
    export BASE_PATH="\${WEB_DOMAIN_HOME}/Server"; 
    echo BASE_PATH=\${BASE_PATH};   ##Value of BASE_PATH is getting picked up## 
    export FOLDER_NAME=\`ls -1d $"{BASE_PATH}"/properties* | grep -i -v old\` ##Value of BASE_PATH is coming blank here## 
    echo $FOLDER_NAME 
EOF 

done 

答えて

1

コンストラクトは、二重引用符で囲まれた文字列のような<< EOF行為を始め、そのエスケープしない限り、ドル記号は、その中の特別です。ここで

は、あなたが$を免れたので、最終的にsshによって開始されたシェルは、その変数

ここ
echo BASE_PATH=\${BASE_PATH}; ##Value of BASE_PATH is getting picked up## 

を評価し、あなたはそれをエスケープしていなかったので、評価は、外殻に起こる:

export FOLDER_NAME=\`ls -1d $"{BASE_PATH}"/properties* ...\` 

また、引用符が間違っていると思われます。 Bashで$".."is a locale-specific translation、そしてそれはseems to be the same in kshです。あなたはおそらくそれのための翻訳を持っていないので、文字列はそのまま返るべきです:{BASE_PATH}

これは、引用符で囲む必要があるため、多少の関連があるかもしれません。 $(...)形式のコマンド置換を使うことができます。だから、もう一度、$について考える必要があります。

は、私は、これはあなたが望むかもしれないと思う:

ssh "$jvm" << EOF 
    export FOLDER_NAME=\$(ls -1d "\${BASE_PATH}"/properties* | grep -i -v old) 
EOF 

健全性チェック:

$ foo=out; bash <<EOF 
> foo=in; echo $foo 
> EOF 
out 

$ foo=out; bash <<EOF 
> foo=in; echo \$foo 
> EOF 
in      
+0

感謝。私はあなたが言ったように私のコードを入れてみましたが、それはうまくいきません。 FOLDER_NAMEの$ BASE_PATHの値は空白になります。 エラー: - ls:0653-341ファイル/プロパティ*は存在しません。 –

+0

@manavsharma、argh、facepalm、私はそこに追加されるはずだった正確なバックスラッシュを見逃しました。したがって、 '$ {var}'は外部シェル(メインスクリプト)からの値を与え、 '\ $ {var}'は(sshの)内部シェルからの値を与えます。 – ilkkachu

+0

@ikkachu、それは最後に働いた。 :) どうもありがとう.. –

関連する問題