2

我需要通过我的 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  
4

3 回答 3

4

Bash 处理这样的行:

a=b c=d command

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

当你写

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

您在“$DEST_USER@$DESTHOST”命令期间将“输出”变量设置为“$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%.*}"部分从“版本”变量的值的末尾删除最后一个点和任何后续字符。

于 2013-08-02T13:36:25.300 回答
0

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

于 2013-08-02T11:10:07.947 回答
0

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

echo "Name   version"
echo $output | grep -Eo "[a-zA-Z]+_[0-9]+.[0-9]+"| tr '_' ' '
于 2013-08-02T11:22:36.977 回答