我正在运行一个expect
脚本,密码有一个$
字符。 shell 会查找以下字符来扩展为某些内容并吐出no such variable
。
有没有办法解决?
答案1
有两种方法;要么反斜杠每个特殊字符,要么在密码周围使用大括号:
expect1.1> set pass "\$Hunter2"
$Hunter2
expect1.2> set pass {$Hunter2}
$Hunter2
三!三种方式:从文件中读取密码thepasswordfile
;这样做的优点是密码不在代码中:
#!/usr/bin/env expect
# wrap with catch(n) or try(n) if you don't want an error to abort
# the code...
set fh [open thepasswordfile]
set password [gets $fh]
puts $password
四、从在标准输出上生成密码的程序收集密码:
#!/usr/bin/env expect
if {[catch {exec ./getthepassword} results options]} {
puts $results
exit 1
}
puts $results
这可能看起来像:
$ cat fromstdin
#!/usr/bin/env expect
if {[catch {exec ./getthepassword} results options]} {
puts $results
exit 1
}
puts $results
$ cat getthepassword
#!/bin/sh
echo '$Hunter2'
$ chmod +x fromstdin getthepassword
$ ./fromstdin
$Hunter2
$
五!五种方式,也可以从环境中读取密码(environ(7)
, tclvars(n)
)
#!/usr/bin/env expect
set password $env(pass)
puts $password
假设export pass='$Hunter2'
在调用此实现之前已在父进程中完成了一个或等效操作。缺点:环境变量被传递给任何和所有子进程,这些子进程可能需要也可能不需要有权查看密码。如果有疑问,请在使用或复制变量后取消设置它:
#!/usr/bin/env expect
set password $env(pass)
unset env(pass)
...
答案2
我遇到了类似的问题,我想在$
期望脚本中传递 fileName ,以下对我有用
filePath=$(echo -n $filePath | sed -e 's/\$/\\\$/g')