簡體   English   中英

Bash將輸出分配給此處文檔中的變量

[英]Bash assign output to variable inside here document

bash腳本中,我需要的是SSH到服務器並執行一些命令,到目前為止,我得到的是這樣的:

outPut="ss"
ssh user@$serverAddress << EOF
cd /opt/logs
outPut="$(ls -l)"
echo 'output is ' $outPut
EOF
echo "${outPut}"

但是終端的輸出是:

output is  ss
ss

output已分配給命令ls -l的輸出,但是顯示的仍然是原始值ss 怎么了

實際上,這里有兩個不同的問題。 首先,在here文檔中,在將文檔發送到命令之前,shell將對變量引用和命令替換進行評估。 因此,在將$(ls -l)$outPut發送(通過ssh )到遠程計算機之前,先在本地計算機上對其進行評估。 您可以通過轉義$ s(以及其他一些字符,例如要發送到遠端的轉義符),或將here-doc分隔符括在引號中( ssh user@$serverAddress << "EOF" )來避免這種情況。 ),以關閉該功能。

其次,在遠程計算機上發生的變量分配保留在遠程計算機上。 本地和遠程Shell無法共享狀態。 如果要從遠程計算機獲取信息,則需要將其作為腳本的遠程部分的輸出發送回去,並捕獲該輸出(例如remoteOutput=$(ssh ...)ssh ... >"$tempFile" )。 如果要發回多個值,腳本的遠程部分將必須格式化其輸出,以使本地部分可以對其進行解析。 另外,請注意,來自遠程部分的任何其他輸出(包括錯誤消息)都將混入其中,因此您必須仔細解析以獲取所需的值。

不,對不起,該方法不起作用。

  1. 在here-doc中使用命令替換值(以printf表示)(EOF之間的行):

     ssh user@$serverAddress << EOF printf 'output is %s\\n' "$(ls -l /opt/logs)" EOF 
  2. 或者,您可以從ssh內部捕獲命令的執行,然后使用該值。

     outPut="$( ssh user@$serverAddress << EOF cd /opt/logs ls -l EOF )" echo 'output is ' "$outPut" echo "${outPut}" 

選項1看起來更干凈。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM