2011-01-12 39 views
18

是否有可能將here文檔作爲bash函數參數傳遞,並且函數中的參數被保存爲多行變量?這裏文檔作爲bash函數的參數

東西大致如下:

function printArgs { 
echo arg1="$1" 
echo -n arg2= 
cat <<EOF 
$2 
EOF 
} 

printArgs 17 <<EOF 
18 
19 
EOF 

或可能:

printArgs 17 $(cat <<EOF 
18 
19 
EOF) 

我有,我想喂ssh作爲命令執行此文件,而SSH會話從一個bash函數中調用。

回答

5

如果你不使用的東西會吸收標準輸入,那麼你將不得不提供的東西做它:

$ foo() { while read -r line; do var+=$line; done; } 
$ foo <<EOF 
a 
b 
c 
EOF 
13

到的方式將有可能是:

printArgs 17 "$(cat <<EOF 
18 
19 
EOF 
)" 

但是,你爲什麼要使用定界符這個?所以你必須(AB)使用cat獲取文件的內容定界符被視爲在參數的文件,爲什麼不這樣做:

print Args 17 "18 
19" 

請記住,這是更好地使一個你想要SSH並運行的機器上的腳本,然後嘗試一些像這樣的破解,因爲bash仍然會在多行參數中擴展變量等。

+1

也許應該有`EOF`和`(``? – 2016-09-14 14:31:00

+0

之間應該有一個換行符,我想通過一個醜陋的Emacs格式來評估批處理模式;這是一個完美的使用案例這個「黑客」 – 2017-08-18 03:14:39

+0

幾個月後,我需要通過一個醜陋的GIMP格式來評估它的TinyScheme批處理器。它似乎繼續<3 – 2018-01-05 04:58:29

1

一種方式餵養的命令通過這裏doc和功能使用SSH是這樣:

#!/bin/sh 
# define the function 
printArgs() { 
echo "$1" 
ssh -T remotehost 
} 
# call it with a here document supplying its standard input 
printArgs 17 <<EOF 
uname 
uptime 
EOF 

結果:

17 
Linux remotehost 2.6.32-5-686 ... 
Last login: ... 
No mail. 
Linux 
16:46:50 up 4 days, 17:31, 0 users, load average: 0.06, 0.04, 0.01 
0

xargs小號應該做到你想要的。它轉換標準輸入參數的命令(通知-0允許保留換行符)

$ xargs -0 <<EOF printArgs 17 
18 
19 
EOF 

但對於你的特殊情況下,我建議你在SSH的標準輸入發送命令:

$ ssh host <<EOF 
ls 
EOF 
3

大廈在Ned的答案中,我的解決方案允許函數將其輸入作爲參數列表或作爲heredoc。

printArgs() (
    [[ $# -gt 0 ]] && exec <<< $* 
    ssh -T remotehost 
) 

這樣你就可以做到這一點

printArgs uname 

或本

printArgs << EOF 
uname 
uptime 
EOF 

所以,你可以使用單一的命令,並以長格式的多個命令第一種形式。