带有期望和变量评估的循环

带有期望和变量评估的循环

我想用 expect 和 for 循环远程执行一个脚本:


#!/usr/bin/expect
set timeout 10

spawn ssh [email protected]
expect "password: "
send "pass\n"
expect "$ "
send "for i in `ls` ;\n"
send "do\n"
send "   STRLENGTH=$(echo -n $i | wc -m);\n"
send "   if [ $STRLENGTH -ge 35 ];\n"
send "   then echo ok \"$i\";\n"
send "   fi\n"
send "done\n"


但它给了我这个错误:

can't read "i": no such variable
    while executing
"send "   STRLENGTH=$(echo -n $i | wc -m);\n""
    (file "./script.sh" line 10)

任何帮助都值得感激,谢谢!

答案1

expect告诉您它尝试替换$i一个值,但未找到变量i。这不是您的意图:您希望将其逐字发送,以便远程 shell 进行替换。使用$反斜杠转义该字符,使其expect逐字传递。

考虑使用sshpass而不是expect太。

答案2

gronostaj 是正确的答案。请注意,您可以将一系列行简化为一个多行字符串文字。请参阅维基百科

send { for i in `ls`
 do
    STRLENGTH=$(echo -n $i | wc -m)
    if [ $STRLENGTH -ge 35 ]
    then echo ok "$i"
    fi
 done
}

使用{}而不是 括住字符串可""保留换行符和$等。但是,您仍需要使用转义\{和。}\

相关内容