使用带有嵌入在 rcp 命令中的变量的反引号表达式

Using backtick expression with variable embedded in an rcp command

我需要在 rcp 调用中嵌入的反引号表达式中使用变量。

我的初步尝试:

#!/bin/sh
release=1
rcp myserver.foo.com:'`ls -t /path/to/my/${release} | head -n 1`' .

我想这是失败的,因为反引号表达式正在 myserver.foo.com 上执行,它没有 release 变量,所以我的 ls 命令的参数是只是 /path/to/my/.

read 通常 eval 命令可用于(我认为)预处理反引号表达式。当我尝试这种方法时:

#!/bin/sh
release=1
rcp myserver.foo.com:'`ls -t /path/to/my/eval ${release} | head -n 1`' .

...反引号表达式仅作为 /path/to/my/eval.

执行

如何在此上下文中的反引号表达式中使用变量?

需要说明的是:我试图在远程服务器上而不是在本地使用反引号 运行 中的代码(但我需要先在本地解析 ${release}

到 运行 远程上的 ls,但是将 $release 扩展到它在本地机器上的值,你需要使用不同的引号。要使变量 $release 在本地扩展,它需要用双引号引起来,而不是单引号。您可以通过以下方式完成:

#!/bin/sh
release=1
scp myserver.foo.com:'$(ls -t /path/to/my/'"${release}"' | sed 1q)' .

如果文件名中有不寻常的字符(例如空格),您可能需要添加更多引号:

scp myserver.foo.com:'"$(ls -t /path/to/my/'"${release}"' | sed 1q)"' .

请注意,您可能想要添加完整路径:

scp myserver.foo.com:/path/to/my/"$release"/'"$(ls -t /path/to/my/'"${release}"' | sed 1q)"' .