期望脚本:获取 bash 命令的输出并设置变量

Posted

技术标签:

【中文标题】期望脚本:获取 bash 命令的输出并设置变量【英文标题】:Expect Script: Grabbing the output of a bash command and setting a variable 【发布时间】:2018-10-01 17:12:06 【问题描述】:

我还很陌生;但是,我有一个当前需要修改的期望脚本,我很难过。

这就是我想要做的,

主机主机名 | awk '打印 $3' | awk -v FS='.' '打印 $4' | tr -d ','

如果结果是特定数字(IP 地址的第 4 个八位字节),则将变量分配给要在脚本中使用的特定值。如果是不同的值,则为其分配不同的变量值。

关于我正在尝试对脚本执行的操作的更多详细信息: - 我有 2 个不同的环境(都以特定的第 4 个八位字节结尾) - scp 一个文件到远程服务器(每个环境都有不同的文件) - 连接到系统(每个环境的登录提示也不同,因此为每个环境传递不同的值)

* 抱歉,如果这令人困惑 *

这是我目前所拥有的(是的,我改变了一些价值观以保护我的环境)。

spawn host hostname | awk print \$3 | awk -v FS=. print \$4 | tr -d ,
expect -exact 15 
set PSWPROMPT password:
set REXPECT remotescript.exp
 -exact 10 
set PSWPROMPT Password:
set REXPECT remotescript.exp_rh

send_user $PSWPROMPT $REXPECT
expect "$"
spawn scp -p filename user@hostname:PATH_FILENAME*
expect -exact "connecting (yes/no)?" 
   send  "yes\r"
   expect -exact $PSWPROMPT
   send  "filename\r"
    -exact $PSWPROMPT 
      send  "filename\r"
   
expect "$"
spawn scp -p filename user@hostname:PATH_FILENAME
expect -exact "connecting (yes/no)?" 
   send  "yes\r"
   expect -exact $PSWPROMPT
   send  "password\r"
    -exact $PSWPROMPT 
      send  "password\r"
   
expect "$"
spawn scp -p $REXPECT *username*@$hostname:PATH_FILENAME*
expect -exact "connecting (yes/no)?" 
   send  "yes\r"
   expect -exact $PSWPROMPT
   send  "password\r"
    -exact $PSWPROMPT 
      send  "password\r"
   
expect "$"

【问题讨论】:

【参考方案1】:

由于您在本地计算机上执行该命令,并且该命令没有任何交互性,因此只需使用 exec 并捕获输出:

set output [exec host hostname | awk print $3 | awk -v FS=. print $4 | tr -d ,]

请注意,Tcl/expect 中的花括号就像 shell 中的单引号一样。要将所需的大括号传递给 awk,我们需要将大括号加倍。或者使用双引号,并转义 awk 美元符号:

set output [exec host hostname | awk "print \$3" | awk -v FS=. "print \$4" | tr -d ,]

或者我们可以在期望中做很多工作:

set host_output [exec host hostname]
set first_list [lindex [split $output \n] 0]
set 3rd_word [lindex [split $first_line] 2]
set 4th_octet [lindex [split $3rd_word .] end]
set no_commas [string map , "" $4th_octet]

OR 使用正则表达式:

regexp .*\.(\d+) [exec host hostname] -> last_octet

【讨论】:

以上是关于期望脚本:获取 bash 命令的输出并设置变量的主要内容,如果未能解决你的问题,请参考以下文章

如何在变量中获取 bash 命令的输出

Bash 脚本将命令输出存储到变量中

Bash脚本变量解释

bash 脚本编程七 将命令输出保存到变量中

bash 脚本编程七 将命令输出保存到变量中

在 bash 脚本中执行命令,直到输出超过某个值