【问题标题】:Unable to store multiple commands in a variable and execute in Bash script无法在一个变量中存储多个命令并在 Bash 脚本中执行
【发布时间】:2017-06-16 11:55:30
【问题描述】:

我有一个如下编写的 Bash 脚本:

#!/bin/bash

PINGGOOGLE=echo "<H1>Ping Status</H1>";echo "<table border=\"1\">"; ping -c 3 -w 3 -q 192.168.16.129 | sed '/ping statistics/,$!d';echo "</table>"

echo '<html>' >> pinghost.txt
echo '<body>' >> pinghost.txt
ssh root@192.168.16.130 "${PINGGOOGLE}" >> pinghost.txt    
echo '</body>' >> pinghost.txt
echo '</html>' >> pinghost.txt

但脚本显示错误。

如果我在 CLI 中执行输出工作正常。当我存储在一个变量中并通过 SSH 在远程机器上使用它时,就会出现问题。

echo "<H1>Ping Status</H1>";echo "<table border=\"1\">"; ping -c 3 -w 3 -q 192.168.16.129 | sed '/ping statistics/,$!d';echo "</table>"

【问题讨论】:

  • 在脚本中使用时应该得到如下输出。

    来自 MS1 服务器的 Codenvy Ping 状态

    --- 192.168.16.129 ping 统计信息 --- 3 个数据包传输,3 个数据包接收,0% 数据包丢失,时间 2001ms rtt min/avg /max/mdev = 0.429/0.527/0.6​​71/0.105 毫秒
  • PINGGOOGLE=echo "&lt;H1&gt;Ping Status&lt;/H1&gt;" 将(尝试)执行一个名为&lt;H1&gt;Ping Status&lt;/H1&gt; 的命令。你想达到什么目的?
  • 我想将输出存储在文本文件中,正如我在评论中所说的那样
  • @hruday 你必须比这更具体。您是否尝试将整行分配给$PINGGOOGLE?如果是这样,您将需要引用它。但是为什么你想这样做呢?它只用在一个地方,将命令存储在字符串中是generally a bad idea
  • 无论如何我现在要求在 html 表中显示输出我应该如何引用它以便我可以在脚本中使用它?

标签: bash variables ssh


【解决方案1】:

我相信会有更好的方法,但这对我来说似乎没问题:

#!/bin/bash

PINGGOOGLE() { echo "<H1>Ping Status</H1>";echo "<table border=\"1\">"; ping -c 3 -w 3 -q 192.168.16.129 | sed '/ping statistics/,$!d';echo "</table>"; }

echo '<html>' >> pinghost.txt
echo '<body>' >> pinghost.txt
{ declare -f PINGGOOGLE; echo PINGGOOGLE; } | ssh root@192.168.16.130 >> pinghost.txt    
echo '</body>' >> pinghost.txt
echo '</html>' >> pinghost.txt

简而言之,不要将命令放在变量中。引用和转义存在问题。将其存储在 bash 函数中。

然后将该函数的定义传递给远程并调用该函数。

注意事项:

  1. 如果有本地别名,将通过此方法扩展。
  2. 如果函数使用任何本地系统变量,它将在远程系统上不可用。
  3. 如果该函数使用仅存在于本地系统而不存在于远程系统上的任何二进制/脚本,它将无法工作。 (显然!)

【讨论】:

    猜你喜欢
    • 2018-12-14
    • 2017-11-28
    • 2012-04-01
    • 1970-01-01
    • 2020-07-01
    • 2021-04-06
    • 2023-04-07
    • 1970-01-01
    • 2014-08-27
    相关资源
    最近更新 更多