2017-03-29 57 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 

它也不能工作。 $ output被設置爲「string2」,因爲$ count沒有被展開。

如何使用擴展父級腳本變量的heredoc,設置自己的變量?

+0

預期它表現。 heredoc中的代碼在遠程主機上運行,​​並且沒有看到「count = 0」的初始化。 – codeforester

+0

有沒有辦法將變量(和其他幾個變量)傳遞給heredoc執行? – user2824889

+3

沒有「heredoc執行」。 heredoc定義了一個字符串。該字符串被傳遞給ssh,由shell進行評估。 –

回答

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'的值從當前shell傳遞到遠程shell – anubhava

+0

@ user2824889:這是否工作? – anubhava

0

可以逃脫變量@anubhava說,或者,如果你得到太多的變量轉義,你可以在兩個步驟做:

# 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 - /usr/bin:/bin:/usr/sbin:/sbin 
1

它是better not to use stdin(例如通過使用here-docs)將命令傳遞給ssh

如果使用命令行參數來傳遞你的shell命令相反,你可以更好的區分什麼是本地展開,哪些將被遠程執行:

# 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" 
相關問題