Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/fsharp/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在Expect脚本中循环Bash数组_Bash_Expect - Fatal编程技术网

如何在Expect脚本中循环Bash数组

如何在Expect脚本中循环Bash数组,bash,expect,Bash,Expect,我的bash脚本中有一个数组: my_file=("a.txt" "b.txt" "c.txt" "d.txt" "e.txt") 现在在同一个文件中,我想使用Expect并进行循环,以获得sftp中的一些文件。这是我的密码 /usr/bin/expect <<EOF set timeout -1 array set param ${!my_file[@]} spawn sftp $sftp_option $user@$host expect "Password:" send "$

我的bash脚本中有一个数组:

my_file=("a.txt" "b.txt" "c.txt" "d.txt" "e.txt")
现在在同一个文件中,我想使用Expect并进行循环,以获得sftp中的一些文件。这是我的密码

/usr/bin/expect <<EOF
set timeout -1
array set param ${!my_file[@]}
spawn sftp $sftp_option $user@$host
expect "Password:"
send "$pswd\r"
expect "sftp>"
for arg in $param; do
send "mget $arg*\r"
expect "sftp>"
done
send "bye\r"
EOF

/usr/bin/expect插入数组值的正确语法为

array set param ${my_file[@]}
没有
,但这会产生

array set param a.txt b.txt c.txt d.txt e.txt
但是,用于创建数组的Expect语法如下所示

array set param {one one.txt two two.txt}
使用交替键和值(更像是关联数组,而不仅仅是值列表)。但是,仍然不能在Expect脚本中使用shell
for
循环;该语言使用完全不同的语法(Expect基于TCL,而不是shell脚本)

也许你正在寻找类似的东西


/usr/bin/expect看起来有点别扭,但你可以这样做:

$my_file=(“a.txt”“b.txt”“c.txt”“d.txt”“e.txt”)

$expect-f---“${my_file[@]}”中的arg的
;执行
我仍然收到相同的错误。我使用$arg*只是为了防止出现诸如.txt.backup等文件。一个问题是数组集不正确。在expect中,数组似乎被设置为列表,并期望设置偶数个项。如果您作为${!my_file[@]}访问,它将只返回索引;给出的答案有一些问题,但似乎是有效的谢谢你的解释。。我试图手动跟踪所有数据,发现问题在于如何使bash中的数组可以接受forexpect。我试图使用
{${my_file[@]}}
,但结果是数组未定义。它对我有效(当然,我使用
cat
而不是
expect
),可能是脚本中一些不相关的部分在干扰?但是如果你在脚本中硬编码数组,你也可以直接将其硬编码到Expect脚本中。我用添加的完整代码编辑了我的文章,也许这可以提供更好的信息。我现在迷路了,Loll,你是如何得出问题出在Expect脚本中的结论的?你能在Expect部分之前打印数组并验证它是否包含你想要的内容吗?@nawanTSL:你正在创建一个Tcl程序,该程序将被bash预处理(通过插值bash变量)。tripleee的解决方案听起来很合理,但如果仍然出现错误,我建议您将问题分为两个步骤:首先创建(使用您的HERE文档)一个变量或文件来保存生成的Tcl/expect程序,然后在调用expect之前将此文件写入stdout。通过这个,您可以看到变量替换是否确实按照您期望的方式执行。
array set param {one one.txt two two.txt}