如何在Expect脚本中将含双引号的所有参数读入单个变量?
在Expect脚本中实现类似Shell $@的参数处理
在Expect里,$argv本身就是存储所有命令行参数的列表变量,功能和Shell的$@完全一致,能正确保留包含空格、双引号的参数作为独立元素。你之前的写法里set var $argv其实是正确的,只是可能对列表的使用方式有误解,下面具体说明:
错误写法分析
set var $argv[@]:这是Shell专属语法,Expect不支持set var [lindex $argv @]:lindex用于获取列表指定索引的元素,@不是合法索引,因此无效set var $args:$args是Expect中expect命令的匹配模式参数,和脚本的命令行参数无关
正确实现方式
直接将$argv赋值给变量即可,它会完整保留所有参数的结构:
示例脚本
#!/usr/bin/expect # 将所有命令行参数存入变量 set all_args $argv # 查看参数列表整体 puts "所有参数:$all_args" # 查看参数个数 puts "参数总数:[llength $all_args]" # 遍历每个参数(保留原始格式) foreach arg $all_args { puts "参数内容:'$arg'" }
测试运行
比如在Shell中执行:
expect test.exp "hello \"world\"" foo "bar baz"
输出会是:
所有参数:{hello "world"} foo {bar baz} 参数总数:3 参数内容:'hello "world"' 参数内容:'foo' 参数内容:'bar baz'
可以看到带双引号、空格的参数都被正确保留为独立元素。
如果需要拼接成Shell风格的参数字符串
如果要把列表转成类似"hello \"world\"" foo "bar baz"这样的字符串,可以用join处理:
set args_str [join $all_args "\" \""] set args_str "\"$args_str\"" puts "Shell风格参数字符串:$args_str"
运行后会输出:
Shell风格参数字符串:"hello \"world\"" "foo" "bar baz"
内容的提问来源于stack exchange,提问作者user1645254
相关产品推荐
相关产品推荐

