只是一个快速问题的人。我想将html标签分配给BASH中的变量。我该怎么做?
或者有更好的方法吗?
这是代码的实际部分:
function storage_util_1942
{
if [ $SETFLAG_1942 = "YES" ];
then
for i in {1..5}
do
TMPSTOR=$(cat $HCREPORT1942 | grep -A$i DISK | tail -1)
RULESET=$(cat $HCREPORT1942 | grep -A$i DISK | tail -1 | awk '{print $6}' | cut -d'%' -f1)
if [ $RULESET -gt 90 ]
then
STORAGE$i="<font color=\"red\"><b>${TMPSTOR}</b></font>"
else
STORAGE$i="<font color=\"green\"><b>${TMPSTOR}</b></font>"
fi
done
fi
echo " <tr align="left">"
echo " <td><font face="verdana,helvetica" size="1" color="red"><b>Storage Capacity <font color="green">[Must be less than 90%]</b></font></td>"
echo " </tr>"
echo " <tr align="left" bgcolor="white" height="80">"
echo " <td><font face="courier new" size="1" color="black">"
echo " <br>"
echo " <pre>"
echo " $STORAGE1"
echo " $STORAGE2"
echo " $STORAGE3"
echo " $STORAGE4"
echo " $STORAGE5"
echo " </pre></font>"
echo " </td>"
echo " </tr>"
}
这是我正在创建的HTML基础报告的一部分。目标是根据上面设置的条件显示$ STORAGE(#)的值。如果它高于90则为RED,否则为GREEN。
当我尝试运行脚本时,它仍然给我“没有这样的文件或目录”错误:
+++ storage_util_1942
+++ '[' YES = YES ']'
+++ for i in '{1..5}'
++++ cat /apps/data/support_bin/monitoring/healthcheck/healthcheck.report
++++ grep -A1 DISK
++++ tail -1
+++ TMPSTOR='/dev/mapper/rootdg-rootdgvol2 ext3 1.9G 1.7G 133M 93% /var'
++++ cat /apps/data/support_bin/monitoring/healthcheck/czchols1942.healthcheck.report
++++ grep -A1 DISK
++++ tail -1
++++ awk '{print $6}'
++++ cut -d% -f1
+++ RULESET=93
+++ '[' 93 -gt 90 ']'
+++ 'STORAGE1=<font color="red"><b>/dev/mapper/rootdg-rootdgvol2 ext3 1.9G 1.7G 133M 93% /var</b></font>'
./script.sh: line 166: STORAGE1=<font color="red"><b>/dev/mapper/rootdg-rootdgvol2 ext3 1.9G 1.7G 133M 93% /var</b></font>: No such file or directory
最后一行之前的评估已经是正确的,但是如何评估该值就像执行它一样?我应该只留下一个价值而不是一个命令。
谢谢,
答案 0 :(得分:1)
你需要围绕变量赋值的引号,并且由于你的值有双引号(并且没有引用其他变量),我会使用单引号:
var='<font color="red">HELLO WORLD</font>'
如果你需要解释赋值中的其他变量,你需要使用双引号,转义任何文字:
var="<font color=\"red\">${TMPSTOR}</font>"
您还需要为“动态命名”变量使用数组:
STORAGE[$i]="..."
echo "$STORAGE[1]"
...
更大的问题是你真正想要做的事情。为什么使用<font>
标签,为什么不只是将CSS类设置为变量(因为这是HTML中唯一的区别)等等。
答案 1 :(得分:1)
您发布的脚本片段中有很多内容可以通过“更好的方式”完成。以下是他们的样本。
不要使用不必要的管道。 awk
将执行grep
,tail
和cut
将执行的所有操作通过管道为每个步骤启动额外的流程。
TMPSTOR=$(awk -vi="$i" '/DISK/{n=i+1} {n--} n==0 {print;exit}' $HCREPORT1942)
在变量周围使用引号。您已经包含了向后的if [ $SETFLAG_1942 = "YES" ];
。您要在引号中保护的是变量,而不是硬编码到脚本中的文本。
您正在使用动态变量命名。这是一件坏事,因为它通常需要使用eval
,这是邪恶的。
eval STORAGE$i="'<font color=\"red\"><b>\${TMPSTOR}</b></font>'"
因此,使用数组而不是STORAGE$i=...
。
declare -a STORAGE
if [ -n "${RULESET//[0-9]/}" ]; then
# RULESET contains non-digts, which it should not.
echo "ERROR: invalid data, please investigate." >&2
exit 1
elif [ "$RULESET" -gt 90 ]; then
STORAGE[$i]="<span class='warn'>${TMPSTOR}</span>"
else
STORAGE[$i]="<span class='good'>${TMPSTOR}</span>"
fi
然后用以下内容遍历数组:
for item in ${STORAGE[@]}; do
echo "$item"
done
最后,您的HTML需要改进,但这个问题不在此。