Expect语言使用spawn传递变量问题:批量移动文件失败
解决Expect脚本中间接变量引用的问题
你遇到的是Expect中间接变量引用的问题,直接拼接变量名的写法无法正确解析到目标变量的值,以下是正确的实现方式:
核心问题分析
- 直接写
spawn mv a$times /tmp/a$times时,a$times会被解析成字符串"a1",而非变量a1的值"First_file.txt"。 - 尝试
${a{$times}}是错误的语法,Expect不支持这种嵌套变量引用格式,因此会抛出cant read "a$times": no such variable的错误。
正确实现方式
Expect中要实现间接变量引用,需要利用set命令的特性:set 变量名会返回该变量的值。通过命令替换[set a$times],可以先解析$times得到变量名前缀,再获取目标变量的值。
单文件处理示例
#!/usr/bin/expect -f set times 1 set a1 "First_file.txt" # 方式1:先获取文件名再执行命令 set target_file [set a$times] spawn mv $target_file /tmp/$target_file # 方式2:直接在spawn中使用命令替换 # spawn mv [set a$times] /tmp/[set a$times]
多文件循环处理示例
如果要批量处理多个类似a1、a2、a3的变量,可以用循环简化代码:
#!/usr/bin/expect -f # 定义多个文件变量 set a1 "First_file.txt" set a2 "Second_doc.pdf" set a3 "Third_photo.jpg" # 循环处理每个文件 for {set i 1} {$i <= 3} {incr i} { set current_file [set a$i] spawn mv $current_file /tmp/$current_file expect eof ;# 等待命令执行完成 }
内容的提问来源于stack exchange,提问作者Heron
相关产品推荐
相关产品推荐

