11

以下对我不起作用:

ssh user@remote.server "k=5; echo $k;"

它只是返回一个空行。

如何在远程会话 (ssh) 上分配变量?

注意:我的问题不是关于如何将本地变量传递给我的 ssh 会话,而是如何创建和分配远程变量。(应该是一个非常简单的任务?)


编辑:

更详细地说,我正在尝试这样做:

bkp=/some/path/to/backups
ssh user@remote.server "bkps=( $(find $bkp/* -type d | sort) );
                        echo 'number of backups: '${#bkps[@]};
                        while [ ${#bkps[@]} -gt 5 ]; do
                            echo ${bkps[${#bkps[@]}-1]};
                            #rm -rf $bkps[${#bkps[@]}-1];
                            unset bkps[${#bkps[@]}-1];
                        done;"

find 命令工作正常,但由于某种原因$bkps没有被填充。所以我的猜测是这将是一个变量分配问题,因为我认为我已经检查了其他所有内容......

4

1 回答 1

19

鉴于此调用:

ssh user@remote.server "k=5; echo $k;"

本地外壳在执行之前正在扩展$k(很可能未设置)ssh ...。因此,一旦建立连接,实际传递给远程 shell 的命令是k=5; echo ;(或者k=5; echo something_else_entirely;如果k实际上是在本地设置的)。

为避免这种情况,请像这样转义美元符号:

ssh user@remote.server "k=5; echo \$k;"

或者,使用单引号而不是双引号来防止局部扩展。但是,虽然这适用于这个简单的示例,但您实际上可能希望在发送到远程端的命令中对某些变量进行本地扩展,因此反斜杠转义可能是更好的路线。

为了将来参考,您还可以set -x在 shell 中键入以回显正在执行的实际命令,作为故障排除的帮助。

于 2012-10-23T15:12:25.167 回答