如何让Expect脚本正确接收包含空格的传入变量?
解决Expect脚本接收带空格变量的参数传递问题
这问题我之前踩过坑!核心原因是shell的参数拆分机制——当你直接写$hello的时候,shell会把变量里的空格当成参数分隔符,把"My Life"拆成两个独立参数传给Expect脚本,所以脚本里的first_var拿到的是"My",second_var拿到的是"Life",完全不符合预期。
最简单的解决方案:传递变量时加双引号
你只需要在调用脚本时,把变量用双引号包裹起来,就能让shell完整保留变量里的空格,不会拆分参数:
hello="My Life" world="is wonderful" ./script.sh "$hello" "$world"
这样传参后,Expect脚本里的[lindex $argv 0]就能完整拿到"My Life",[lindex $argv 1]拿到"is wonderful",和你直接执行./script.sh 'My Life' 'is wonderful'的效果完全一致。
为什么双引号能解决问题?
shell在处理不带引号的变量扩展(比如$hello)时,会自动执行两个操作:
- 单词拆分(Word Splitting):把变量内容按空格、制表符等空白字符拆分成多个单词
- 路径扩展(Pathname Expansion):把包含通配符的内容展开成匹配的文件名
而用双引号包裹变量("$hello")时,shell会抑制这两个操作,完整保留变量的原始内容,包括空格和特殊字符,完美解决参数被拆分的问题。
扩展:如果在shell脚本里调用Expect脚本
要是你把变量定义和调用写在一个shell脚本里,同样要记得给变量加双引号:
#!/bin/bash hello="My Life" world="is wonderful" # 必须用双引号包裹变量 ./script.sh "$hello" "$world"
内容的提问来源于stack exchange,提问作者Eddie
相关产品推荐
相关产品推荐

