bash:如何使用数组创建另一个数组?

时间:2015-04-16 12:49:09

标签: arrays bash shell

我尝试将shell脚本用作cron的HDD温度警报作业。 cron工作必须做这些事情:

  1. 验证现有的ATA设备(我使用camcontrol);
  2. 验证所识别设备的温度(我使用smartctl);
  3. 将ATA设备的温度与常数变量进行比较;
  4. 如果其中一个设备温度高于常量变量,则脚本会发送一封包含所有ATA设备温度的电子邮件。
  5. 我的问题是如何使用第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,但没有"以下光盘太热:" 消息显示...... :(

1 个答案:

答案 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