我尝试将shell脚本用作cron的HDD温度警报作业。 cron工作必须做这些事情:
我的问题是如何使用第2项的结果来完成第3项......
我的实际代码是:
# Defines alert temperature
TEMP_MAX=30 #Graus celcius
# Create an array with devices
arrdiscs=($(camcontrol devlist | awk '{print substr($NF, 8, length($NF)-8)}'))
# Get the temperature of the devices
for i in "${arrdiscs[@]}"
do
# Get temperatures
TEMP="$(smartctl -A /dev/$i | egrep ^194 | awk '{print $10}')"
done
如果我使用,我可以回显设备名称和温度:
for i in "${arrdiscs[@]}"
do
TEMP="$(smartctl -A /dev/$i | egrep ^194 | awk '{print $10}')"
echo "[$i]: $TEMP"
done
我尝试过(以及其他许多方式):
for i in "${arrdiscs[@]}"
do
TEMP="$(smartctl -A /dev/$i | egrep ^194 | awk '{print $10}')"
echo "[$i]: $TEMP"
done
echo "ARRAY DISCOS: ${arrdiscs[*]}"
echo "TEMPERATURAS: ${TEMP[*]}"
以上代码打印" arrdiscs"正确但是" TEMP"打印空。
那么......我如何根据TEMP变量创建一个数组,以便我可以验证温度是否高于TEMP_MAX?
按照Etan Reisner的建议进行了一些更改:
# Defines alert temperature
temp_max=20 #Graus celcius
# Monta array de discos do sistema
arrdiscs=($(camcontrol devlist | awk '{print substr($NF, 8, length($NF)-8)}'))
echo "${arrdiscs[@]}"
alertdiscs=()
for i in "${arrdiscs[@]}"
do
temp=("$(smartctl -A "/dev/$i" | egrep ^194 | awk '{print $10}')")
if [ -z "$temp" ]; then
echo "\$temp is empty"
else
if [ $temp -gt $temp_max ]; then
alertdiscs+=("[$i]: $temp")
echo ${temp[@]}
fi
fi
done
if [ ${#alertdics[@]} -gt 0 ]; then
echo "The following discs were too hot:"
printf '%s\n' "${alertdiscs[@]}"
else
echo "${alertdiscs[@]}"
fi
但我得到的结果如下:
ada0 ada1 ada2 ada3 da0
33
31
32
30
$temp is empty
[ada0]: 33 [ada1]: 31 [ada2]: 32 [ada3]: 30
变量temp_max设置为20,但没有"以下光盘太热:" 消息显示...... :(
答案 0 :(得分:1)
您可以像这样零碎地创建数组:
temps=()
for i in "${arrdiscs[@]}"
do
temps+=("$(smartctl -A "/dev/$i" | egrep ^194 | awk '{print $10}')")
done
echo "${temps[*]}"
话虽如此,我可能会建议将大部分温度保持在循环本地,并且只将适合警报的温度(和磁盘)存储在适合在最后消息中使用的数组中。
# Defines alert temperature
temp_max=30 #Graus celcius
alertdiscs=()
for i in "${arrdiscs[@]}"
do
temp=("$(smartctl -A "/dev/$i" | egrep ^194 | awk '{print $10}')")
if [ -n "$temp" ] && [ $temp -gt $temp_max ]; then
alertdiscs+=("[$i]: $temp")
fi
done
if [ ${#alertdiscs[@]} -gt 0 ]; then
echo "The following discs were too hot:"
printf '%s\n' "${alertdiscs[@]}"
fi