1

以下是检查磁盘 SMART 状态的每日报告脚本的片段。

但是,我希望将 $STATUS 的全部值打印在“else”子句中,但是现在它只将其截断为第一个单词($3)。

我该如何克服呢?

echo "SMART STATUS" >> $LOGS
echo "--------------------------" >> $LOGS
DISKS=( 0 1 2 3 4 5 6 7 )

for i in "${DISKS[@]}" ;

do

STATUS=`diskutil info /dev/disk$i | grep SMART | awk '{ print $3 }'`

if [ "$STATUS" = "Verified" ]; then
        echo "SMART STATUS OK FOR DISK $i" >> $LOGS
else

        echo "** SMART STATUS $STATUS FOR DISK $i **" >> $LOGS
fi
done

echo " " >> $LOGS
echo " " >> $LOGS

例如:

$ diskutil info /dev/disk8 | grep SMART                     
   SMART Status:             Not Supported
$ diskutil info /dev/disk2 | grep SMART 
   SMART Status:             Verified

理想情况下,对于像 disk8 这样的情况,脚本会回显“不支持”。我认为“SMART Status:”的值可能会在一个词​​和几个词之间变化。我没有在手册页上看到所有可能性,所以我对此没有明确的答案。

4

4 回答 4

2

您可以保存grep, 并将所有内容放入 awk 中:

试试这个:

STATUS=$(diskutil info /dev/disk$i|awk -F': *' '/SMART/{print $2}')
于 2013-02-10T18:19:20.340 回答
1

这符合您的需求吗?

disks="0 1 2 3 4 5 6 7"

for i in $disks; do
    status=$(diskutil info /dev/disk$i | awk '/SMART/{$1=$2="";print}')

    if [[ $status == *Verified* ]]; then
            echo "SMART status OK for disk $i"
    else
            echo "** SMART status $status for disk $i **"
    fi
done
于 2013-02-10T18:16:15.277 回答
0

cut解决方案

如果您可以依靠 打印的空格数diskutil,您可以从状态的第一个字符开始切割:

STATUS=`diskutil info /dev/disk$i | grep SMART | cut -c 30-`

awk解决方案

单词Supported被捕获为$4,因此我们可以使用 if 语句来检查单词是否被填充:

STATUS=`diskutil info /dev/disk$i | grep SMART | awk '{ if($4 != "") print $3,$4; else print $3; }'`
于 2013-02-10T18:16:32.787 回答
0

如果你有 GNU grep,你可以这样做:

STATUS=$(diskutil info /dev/disk$i | grep -oP '(?<=SMART Status:).*')

变量的内容将包含前导空格。但是,您的 if 条件可以适应:

shopt -s extglob
if [[ ${STATUS##*([[:space:]])} == Verified ]]; then
于 2013-02-10T18:27:39.590 回答