执行集成Expect的Trino调用Bash脚本时遇变量读取错误求助
解决Expect调用Trino时“can't read "1207": no such variable”错误
问题根源
Expect会自动解析字符串中的$符号,将其视为变量引用。你在Bash中用\$转义是给Bash层面处理的,但当变量传递到Expect后,Expect会把\$解析成$,进而尝试读取1207这个未定义的变量,导致报错。即使移除$后仍有问题,大概率是脚本中变量传递或Expect语法存在其他疏漏。
解决方案
以下几种方法可以彻底解决这个问题:
1. 在Expect中用花括号包裹密码,阻止变量解析
在Bash中用单引号定义密码(避免Bash转义),然后在Expect的send命令里用花括号把密码括起来,Expect就不会解析其中的$:
#!/bin/bash PASSWORD='pwdenb$1207' expect << EOF spawn trino --server your-trino-host:port --user your-username --password expect "Password:" send "{$PASSWORD}\r" # 后续的Expect逻辑,比如等待命令执行完成 expect eof EOF
2. 对$进行双重转义,让Expect识别为字面量
在Bash中给$加两层转义(\\\$),这样Bash解析后会传递给Expect一个\$,Expect最终会把它当作字面量$处理:
#!/bin/bash PASSWORD="pwdenb\\\$1207" expect << EOF spawn trino --server your-trino-host:port --user your-username --password expect "Password:" send "$PASSWORD\r" expect eof EOF
3. 在Expect内部直接定义密码
跳过Bash变量传递,直接在Expect脚本里定义密码,用\$转义确保Expect不解析变量:
#!/bin/bash expect << EOF set trino_password "pwdenb\$1207" spawn trino --server your-trino-host:port --user your-username --password expect "Password:" send "\$trino_password\r" expect eof EOF
额外排查点
如果移除$后仍报错,检查脚本中是否还有其他类似$数字或未定义的变量引用,比如Expect脚本里是否不小心写了$1、$2这类位置参数但未定义。
内容的提问来源于stack exchange,提问作者Azmat Hayat
相关产品推荐
相关产品推荐

