如何获取变量的命令输出?

时间:2019-01-29 09:49:04

标签: bash expect

我将以下代码作为.sh文件执行,并得到了预期的结果。现在,我需要存储“发送”命令的输出并做进一步的工作。

我已经完成了以下bash代码,现在将输出保存在文件中:

#!/usr/bin/expect -f

spawn iroot
expect ".* password for"
sleep 3
send "password\r"
sleep 5
send "dmidecode -t system | grep Manufacturer > /tmp/manfacdetails.txt\r"
send "exit\r"
interact

我该怎么做?

1 个答案:

答案 0 :(得分:0)

似乎您正在使用iroot来获得对电话的root访问权限,并以root身份发出命令。

我在这里假设您已经拥有的命令是非交互式的,并且如果您将重定向重定向到文件而没有任何人工干预,则会生成您想要的输出。

然后,常见的常见问题解答How to set a variable to the output of a command in Bash?

涵盖了捕获其输出的简单问题。
#!/bin/bash

manufacturer=$(expect <<\____HERE)
    spawn iroot
    expect ".* password for"
    sleep 3
    send "password\r"
    sleep 5
    send "dmidecode -t system | grep Manufacturer\r"
    send "exit\r"
    interact
____HERE

if [ "$manufacturer" = "Motor Ola" ]; then
    ola=1
fi

# Maybe you'll prefer case over if, though
case $manufacturer in
    "Samsung" | "LG" ) korean=1 ;;
    "Apple")
        echo "$0: You're kidding, right?" >&2
        exit 127;;
    *)  echo "$0: Unknown manufacturer $manufacturer" >&2
        exit 1;;
esac

如果这对您不起作用,那么Use expect in bash script to provide password to SSH command有一些您可能想尝试的变体。

您似乎也对脚本的性质感到困惑。第一行带有shebang的任何可执行文件都可以通过此处指定的任何解释器执行。我的有/bin/bash,所以这是一个Shell脚本,更具体地说是Bash脚本,而您的有expect作为其解释器,所以它是Expect脚本。您通常还会有Awk脚本,Perl脚本和Python脚本(而且很少,但在许多其他语言中却很少见,但并非完全不常见)。

如上所述,Expect也是一种脚本语言,您可能希望保留自己的Expect脚本,而不是带有嵌入式Expect脚本片段的Shell脚本。也许然后看看expect: store output of a spawn command into variable

包含脚本的文件名可以是任何东西,但是标准建议是不要给扩展名-Unix不在乎,如果您的.sh文件是一个Expect脚本(目前是这样)。

也许还切切地看到Difference between sh and bashhttp://shellcheck.net/,可用于诊断(shell)脚本中的语法错误。