45

是否可以将此处的文档作为 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,并且从 bash 函数调用 ssh 会话。

4

5 回答 5

34

实现这一目标的方法是:

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

但是为什么要为此使用heredoc?heredoc 在参数中被视为文件,因此您必须(ab)使用cat来获取文件的内容,为什么不这样做:

print Args 17 "18
19"

请记住,最好在要 ssh 的机器上创建一个脚本并运行它,然后尝试像这样的一些 hack,因为 bash 仍然会在你的多行参数中扩展变量等。

于 2011-01-12T00:39:36.590 回答
15

如果您不使用会吸收标准输入的东西,那么您将不得不提供一些东西来做到这一点:

$ foo () { while read -r line; do var+=$line; done; }
$ foo <<EOF
a
b
c
EOF
于 2011-01-12T06:20:27.180 回答
7

基于 Ned 的回答,我的解决方案允许函数将其输入作为参数列表或 heredoc。

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

所以你可以这样做

printArgs uname

或这个

printArgs << EOF
uname
uptime
EOF

因此,您可以将第一种形式用于单个命令,将长形式用于多个命令。

于 2014-09-26T12:12:12.403 回答
3

xargs应该做你想做的事。它将标准输入转换为命令的参数(注意-0允许保留换行符)

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

但是对于您的特殊情况,我建议您在 ssh 的标准输入上发送命令:

$ ssh host <<EOF
ls
EOF
于 2013-09-11T09:07:46.883 回答
0

通过此处的文档和函数向 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
于 2011-01-12T00:52:12.847 回答