2017-03-29 9 views
3

メインスクリプトから既存の変数を呼び出す必要があるheredocがあります。は、後で使用する独自の変数を設定しています。このようなもの:heredocセクションで変数を設定および展開する方法

count=0 

ssh $other_host <<ENDSSH 
    if [[ "${count}" == "0" ]]; then 
    output="string1" 
    else 
    output="string2" 
    fi 
    echo output 
ENDSSH 

「出力」が何も設定されていないため、これは機能しません。

私はこの質問からソリューションを使用してみました:

count=0 

ssh $other_host << \ENDSSH 
    if [[ "${count}" == "0" ]]; then 
    output="string1" 
    else 
    output="string2" 
    fi 
    echo output 
ENDSSH 

それはどちらか動作しませんでした。 $ countは展開されていないので、$ outputは "string2"に設定されています。

親スクリプトの変数を展開するheredocを使用するには、は独自の変数を設定しますか?

+0

期待どおりに動作しています。 heredoc内部のコードはリモートホスト上で実行され、 'count = 0'初期化は表示されません。 – codeforester

+0

変数(とその他のもの)をheredocの実行に渡す方法はありますか? – user2824889

+3

"heredocの実行"はありません。 heredocは文字列を定義します。文字列はsshに渡され、シェルによって評価されます。 –

答えて

3

あなたが使用することができます:それはないローカル、リモートホスト上に展開されるように

count=0 

ssh -t -t "$other_host" << ENDSSH 
    if [[ "${count}" == "0" ]]; then 
    output="string1" 
    else 
    output="string2" 
    fi 
    echo "\$output" 
    exit 
ENDSSH 

我々は\$outputを使用しています。

+0

'$ count'の値は現在のシェルからリモートシェルに渡されます。 – anubhava

+0

@ user2824889:これは機能しましたか? – anubhava

0

@anubhavaが言ったようにあなたは、変数をエスケープすることができ、または、あなたはエスケープ処理のためにあまりにも多くの変数を取得する場合、次の2つのステップでそれを行うことができます。

1 - /usr/bin:/bin:/usr/sbin:/sbin 

# prepare the part which should not be expanded 
# note the quoted 'EOF' 
read -r -d '' commands <<'EOF' 
if [[ "$count" == "0" ]]; then 
    echo "$count - $HOME" 
else 
    echo "$count - $PATH" 
fi 
EOF 

localcount=1 
#use the unquoted ENDSSH 
ssh [email protected] <<ENDSSH 
count=$localcount # count=1 
#here will be inserted the above prepared commands 
$commands 
ENDSSH 

のようなものを出力します

1

sshにコマンドを渡すのはbetter not to use stdinです(here-docsなどを使用しています)。

あなたのシェルではなく、コマンドを渡すためにコマンドライン引数を使用する場合は、ローカルで展開されていると、何がリモートで実行されるかをよりよく分離することができます:

# Use a *literal* here-doc to read the script into a *variable*. 
# Note how the script references parameter $1 instead of 
# local variable $count. 
read -d '' -r script <<'EOF' 
    [[ $1 == '0' ]] && output='zero' || output='nonzero' 
    echo "$output" 
EOF 

# The variable whose value to pass as a parameter. 
# With value 0, the script will echo 'zero', otherwise 'nonzero'. 
count=0 

# Use `set -- '$<local-var>'...;` to pass the local variables as 
# positional parameters, followed by the script code. 
ssh localhost "set -- '$count'; $script" 
関連する問題