4

テストでは、echoコマンドライン変数が機能していることがわかりますが、それらを渡したり、エクスポートしたりして、組み込みで使用するにはどうすればよいexpectですか?

#!/bin/bash

echo name of script is $0
echo host is $1
echo hostusername is $2
echo hostpassword is $3

expect -c 'spawn ssh -l $2 $1 < ./sf-wall_scp_bash.sh
sleep 2

expect {
"(yes/no)? " {send "yes\n"}
    exp_continue
}

expect {
"?assword" {send "$3\r"}
}
sleep 1
'

expectシバンで呼び出された場合、次のように機能します

#!/usr/bin/expect

set host [lindex $argv 0]
set hostusername [lindex $argv 1]
set hostpassword [lindex $argv 2]


spawn ssh -l $hostusername $host
sleep 2

expect {
"(yes/no)? " {send "yes\n"}
    exp_continue
}

expect {
"?assword" {send "$hostpassword\r"}
}
sleep 1

...期待どおりに動作します。スクリプトはbash固有のコマンド、関数、組み込み変数を呼び出す必要があるため、使用bashして埋め込む必要があります...それ以外の場合は、2番目の例を使用するだけで機能しますが、そうではありません。expect

コマンドライン引数変数を宣言してエクスポートし、上記の最初の例の $1、$2、$3 をそれぞれ宣言およびエクスポートされた変数名に変更してみました。これは、実際に変数を宣言している別のスクリプトで機能しますスクリプト...違いは、それらがコマンドライン引数ではないことです。

host=$1
export host
hostusername=$2
export hostusername
hostpassword=$3
export hostpassword

それらをエクスポートするだけでなく、

export host
export hostusername
export hostpassword

上記の最初の例を試します。変化なし、expect主張し続ける

「X」を読み取れません: そのような変数はありません

別の bash スクリプトでは、上記の例のように変数を宣言してからエクスポートすることで、変数を正常にエクスポートできました。bashしかし、コマンドライン引数変数をに渡すことで、そのような幸運を得ることができませんでしたexpect

4

1 に答える 1

6

ネストされた引用符を含むコードは、読み書きが容易ではありません。シェルのヒアドキュメント構文を使用することをお勧めします。bash例( varsをに渡す2つの方法のデモexpect):

$ cat foo.sh
arg1=$1
export arg2=$2

expect << END
puts $arg1
puts \$env(arg2)
END
$ bash foo.sh hello world
hello
world
$

に特別な文字(、またはスペースなど)が含まれているかどうかを心配する必要がないため、私export varはシェルからそれを参照し、期待どおりに参照します。$env(var)var'"

于 2013-03-14T14:25:08.400 に答える