我需要通过我的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
答案 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 '_' ' '