脚本引入expect后无法使用echo、数组及for循环报错该如何解决?
问题原因
脚本开头的#!/usr/bin/expect会指定当前脚本由Expect解释器执行,Expect是基于Tcl语言开发的交互自动化工具,仅支持Tcl语法规则。你代码中的declare数组声明、Bash风格for循环、echo命令都属于Bash Shell的专属语法/内置命令,Expect无法识别,因此会抛出invalid command name错误。
去掉该shebang后系统会默认使用Bash解析脚本,因此相关语法可以正常运行。
解决方案
根据你的使用场景可以选择以下两种方案:
- 方案1:以Bash为主体,嵌套调用Expect(更适合Bash逻辑占比高的场景)
保留Bash的数组、循环等原生逻辑,仅将需要处理交互的部分通过参数传入Expect执行,示例代码如下:#!/bin/bash # Bash层正常声明数组、编写循环逻辑 declare -a arr=("ip1" "ip2") for i in "${arr[@]}" do # 调用expect执行交互逻辑,Bash变量会在传入前完成替换 expect -c " spawn ssh myhost@$i # 可补充交互匹配规则,例:expect \"password:\" {send \"你的密码\\n\"} send \"exit\\n\" expect eof " done - 方案2:完全使用Expect原生语法编写脚本(更适合交互逻辑占比高的场景)
全程使用Expect/Tcl语法实现所有逻辑,替换Bash相关语法即可,示例代码如下:
Expect中如需打印内容可使用#!/usr/bin/expect # Expect语法声明数组 set arr {"ip1" "ip2"} # Expect遍历数组的语法 foreach i $arr { spawn ssh myhost@$i send "exit\n" expect eof }puts命令替代Bash的echo。
内容的提问来源于stack exchange,提问作者Insta Life
相关产品推荐
相关产品推荐

