1

我在执行基本上从服务器捕获磁盘空间并将结果输出到 html 页面的脚本时遇到问题。

存储=$(df -PTh | 列 -t | 排序 -n -k6n)

STDOUT 中的输出正常。它的格式很好。当我将变量回显到 HTML 页面时,输出变为一行,就像这样:

/dev/vx/dsk/localdg/wm7x01 vxfs 30G 21G 9.3G 70% /apps/wm7x01 /dev/mapper/vg00-vrts ext3 6.9G 4.7G 2.3G 68% /vrts_install /dev/mapper/vg00-ora11g_cli ext3 7.7 G 4.1G 3.3G 57% /usr/oracle11g_cli /dev/mapper/vg00-repackage ext3 1008M 423M 586M 42% /var/spool/repackage /dev/vx/dsk/cfs_dcgnts_dg/shared vxfs 220G 91G 130G 42% /apps/共享

我什至尝试使用引号: echo "$STORAGE"

我也尝试使用数组: echo "{STORAGE[@]}"

不幸的是,所有的结果都是一样的。你能帮忙吗?

谢谢

4

2 回答 2

0

快速,丑陋的黑客攻击:

STORAGE=$(df -PTh | column -t | sort -n -k6n | sed 's:$:<br/>:')

这会在每行的末尾放置一个换行符......但它不会将其格式化为表格。为此,这是另一个快速、丑陋的 hack:

STORAGE="<table>$(df -PTh | column -t | sort -n -k6n | sed 's:$:<br/>:;s:  *:</td><td>:;s:.*:<tr><td>&</td></tr>:')</table>"

这会将所有出现的一个或多个空格替换为拆分列所需的 HTML,然后将表格行包装器添加到每一行,最后将整个输出包装在 HTML<table>标记中。

我再说一遍:这是一个丑陋的黑客。它应该在紧要关头大部分时间都可以工作,但如果你有其他任何添加空格的东西,比如设备名称或文件系统名称,它肯定会中断。(曾经安装过 U 盘并在其卷中留有空间?)

请注意,这个丑陋的 hack 不使用任何特定于 bash 的东西。你可以在更传统的 Bourne 风格的 shell 中轻松地做到这一点。

另一种可能更简单的方法是简单地将这个文本标记为预格式化(就是这样):

STORAGE="<pre>$(df -PTh | column -t | sort -n -k6n)</pre>"

最后,如果你想用这个来害羞并使用数组,这里有一个例子:

#!/usr/local/bin/bash

mapfile -t a_storage < <(df -PTh | column -t | sort -n -k6n)

td="th"
echo -n "<table>"
for line in "${a_storage[@]}"; do
  a_line=($line)
  echo "<tr>"
  for field in ${a_line[@]}; do
    echo "    <$td> ${field//</&lt;} </$td>"
  done
  echo -n "  </tr>"
  td="td"
done
echo "</table>"

这与上面的单行代码几乎完全相同,但它为您说明了一些事情。它仍然容易受到意外空白的影响。

Bash 不是生成 HTML 的理想编程环境。

于 2013-11-14T04:31:06.747 回答
0

也许您需要了解一点 HTML 以及如何将文本格式化为表格和列?

无论如何,在您的内容之前和之后放置<pre></pre>标记,如下所示:

echo "<pre>$STORAGE</pre>"

它不会创建 HTML 表格,但至少不会丢失空格

于 2013-11-14T04:31:29.007 回答