这里将文档作为bash函数的参数

时间:2011-01-12 00:26:13

标签: bash function shell arguments heredoc

是否可以将here文档作为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)

我有一个here文档,我希望将ssh作为执行命令提供给ssh,并从bash函数调用ssh会话。

5 个答案:

答案 0 :(得分:15)

可能的方法是:

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

但是你为什么要使用heredoc呢? heredoc被视为参数中的文件,因此您必须(ab)使用cat来获取文件的内容,为什么不执行以下操作:

print Args 17 "18
19"

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

答案 1 :(得分:7)

如果你没有使用能够吸收标准输入的东西,那么你将不得不提供能够吸收标准输入的东西:

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

答案 2 :(得分:3)

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

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

所以你可以这样做

printArgs uname

或者

printArgs << EOF
uname
uptime
EOF

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

答案 3 :(得分:1)

通过here 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

答案 4 :(得分:0)

xargs应该完全按照您的意愿行事。它将标准输入转换为命令的参数(通知-0允许保留换行符)

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

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

$ ssh host <<EOF
ls
EOF