如何在变量bash脚本中存储远程主机的输出

时间:2013-08-02 11:04:37

标签: bash

我需要通过我的bash脚本打印远程tomcat服务器上的所有战争。 我能够在远程服务器上ssh并执行命令以获得版本的战争: -

${SSH} ${DEST_USER}@${DESTHOST} "Command"

但是如果我将它存储在一个变量中,我就不会得到任何东西: -

output=${SSH} ${DEST_USER}@${DESTHOST} "Command"
echo $output

基于一点研究,如果我尝试

output=$(${SSH} ${DEST_USER}@${DESTHOST} "Command"
echo $output

我存储了输出(需要理解为什么?)。

其次我输出的输出为:

abc_1.2.war ijk_2.2.war hij_3.2.war xyx_5.1.war

如何将此输出格式化为:

Name version
abc  1.2
ijk  2.2
hij  3.2
xyz  5.1  

3 个答案:

答案 0 :(得分:4)

Bash处理这样的行:

a=b c=d command

仅在命令的持续时间内临时设置环境变量“a”和“c”。它们不是普通的shell变量,在命令完成后它们将不存在。

写作时

output=${SSH} ${DEST_USER}@${DESTHOST} "Command"

在“$ DEST_USER @ $ DESTHOST”命令的持续时间内,您将“output”变量设置为“$ SSH”的内容(我希望您收到“未找到命令”错误)。

正如您所发现的,捕获命令输出的方法是使用$()语法

output=$($SSH $DEST_USER@$DESTHOST "Command")

(注意,你不必总是在你的变量名称周围加上大括号,只有当你需要将变量名与周围的文本分开时才是必需的)


对于文字格式问题:

output="abc_1.2.war ijk_2.2.war hij_3.2.war xyx_5.1.war"
{
    echo Name version
    for word in $output; do                    # no quotes around $output here!
        IFS=_ read name version <<< "$word"
        echo "$name" "${version%.*}"
    done
} | column -t
Name  version
abc   1.2
ijk   2.2
hij   3.2
xyx   5.1

这里我使用大括号将标题和for循环中的行组合在一起以将它们发送到列。我不认为您知道所有文件扩展名,但我确实假设每个文件都有扩展名。 "${version%.*}"部分删除“version”变量值末尾的最后一个点和后面的任何字符。

答案 1 :(得分:0)

尝试echo "$output"(即引号)。

答案 2 :(得分:0)

我现在无法帮助'为什么'。但是,您可以从变量(包含单行)生成所需的输出,如下所示:

echo "Name   version"
echo $output | grep -Eo "[a-zA-Z]+_[0-9]+.[0-9]+"| tr '_' ' '