将变量传递给bash数组中的`expect`

use*_*925 2 linux variables bash for-loop expect

我正在尝试使用 FOR 循环遍历 IP 地址(在 bash 数组中)、登录、运行脚本然后退出。该数组称为 ${INSTANCE_IPS[@]}。但是,以下代码不起作用,因为expect似乎无法接受变量 $instance。

for instance in ${INSTANCE_IPS[@]}
  do
  echo $instance
  /usr/bin/expect -c '
  spawn ssh root@$instance;
  expect "?assword: ";
  send "<password>\r";
  expect "# ";
  send ". /usr/local/bin/bootstrap.sh\r";
  expect "# ";
  send "exit\r" '
done
Run Code Online (Sandbox Code Playgroud)

但是,expect抱怨:

can't read "instance": no such variable
    while executing
"spawn ssh root@$instance"
Run Code Online (Sandbox Code Playgroud)

位于此处的stackoverflow 上还有另一个问题,它使用环境变量来实现这一点,但是它不允许我像在数组中那样遍历不同的 IP 地址。

任何帮助表示赞赏。

干杯

Rob*_*ale 5

问题在于引用。整个块周围的单引号不会让 Bash 扩展变量 ( $instance)。

您需要切换到双引号。但是,双引号内的双引号是不允许的(除非您对它们进行转义),因此我们最好将单引号与expect字符串一起使用。

试试吧:

for instance in ${INSTANCE_IPS[@]}
  do
  echo $instance
  /usr/bin/expect -c "
  spawn ssh root@$instance;
  expect '?assword: ';
  send '<password>\r';
  expect '# ';
  send '. /usr/local/bin/bootstrap.sh\r';
  expect '# ';
  send 'exit\r' "
done
Run Code Online (Sandbox Code Playgroud)