如何设置在bash脚本中使用另一个变量的变量?

时间:2012-05-24 03:26:10

标签: bash

我正在尝试设置一个在bash脚本中使用另一个变量的变量:

echo "Enter server IP:"
read serverIP

ssh="ssh $serverIP"

$ssh cp ...
$ssh mv ...
$ssh rm ...

然而,这不起作用。在这种情况下,正确的语法是什么?

3 个答案:

答案 0 :(得分:1)

你可以使用

SERVER_IP="127.0.0.1"
alias ssh="ssh $SERVER_IP"

你很高兴

答案 1 :(得分:1)

如果您想运行remote commands via SSH,唯一安全的方法是使用arrays和参数转义。

首先,使用一个数组来存储命令,选项,标志,参数等。例如:

remote_cmd=(touch -- "path with spaces")
echo "${remote_cmd[2]}" # path with spaces

您需要转义每个参数以便通过SSH运行:

for arg in "${remote_cmd[@]}"
do
    remote_cmd_escaped+=("$(printf %q "$arg")")
done
echo "${remote_cmd_escaped[2]}" # path\ with\ spaces

然后你应该为SSH命令本身使用另一个数组:

ssh_cmd=(ssh "localhost" "${remote_cmd_escaped[@]}")

现在您可以毫无问题地运行它:

"${ssh_cmd[@]}"

验证文件是否使用空格创建:

ls "$HOME/path with spaces"

成功!

答案 2 :(得分:0)

尝试

 eval $ssh cp ...

我不认为设置serverIP和ssh是引用该值的问题。

Eval推迟从shell到系统的最终提交命令,允许另一次传递。在第一次传递中,$ssh被扩展,在第二次和最后一次(eval)传递中,现在shell可以看到$ ssh实际上意味着ssh 10.10.10.10(例如)。

Eval被认为是邪恶的,用户可以通过执行/bin/rm -rf /*的serverIP变量提交正确的sytnax。所以要小心你如何使用它。

最后一点琐事,有可能,但几乎不是每一个实际的,在一条线上使用更多的1 eval传递,即eval eval eval... \$${ssh} ....

我希望这会有所帮助。