Bash脚本 - 检查已安装的设备

时间:2017-06-06 22:02:43

标签: linux bash if-statement raspberry-pi

我正在尝试做什么 - 最后,我想要一个脚本来检查3个设备,一个SD卡,Backup1&备份服务器。它们都被设置为在各自的挂载点上自动安装。脚本应首先检查SD卡,如果失败,则应发送警告,仅此而已。如果SD没问题,但只安装了一个备份,则要求确认继续使用rsync挂载备份。如果已安装所有设备,则从SD卡rsync到两个备份。

目前我只是尝试使用echo命令检查设备是否已被检查。这是我拥有的(经过多次尝试) -

if ! mount | grep /media/card >/dev/null
then
    echo "ERROR: SD card not mounted, aborting"
else
    if ! mount | grep /media/backup >/dev/null
        then
            if ! mount | grep /media/backup2 >/dev/null
            then
                echo "ERROR: No backup devices"
            else
                echo "CAUTION: Backup_2 missing, Backup_1 OKAY"
            fi
    else
        if ! mount | grep /media/backup2 /dev/null
        then
            echo "CAUTION: Backup_1 missing, Backup_2 OKAY"
        else
            echo "SUCCESS: All devices OKAY"
        fi
    fi
fi

哪个不行。我对所有嵌套的'if'感到困惑,肯定有更简单的方法吗?也许某些东西会独立检查每个设备,然后返回等于各种组合的值(0 =没有设备,1 =仅sd,2 = sd& backup1,3 = sd& backup 2,4 =全部没问题)然后读取并决定下一部分脚本运行?如果没有,这种方式哪里出错?

感谢任何帮助

3 个答案:

答案 0 :(得分:1)

解决!问题的一部分是使用mount | grep /media/backup > /dev/null因为存在类似名称的问题,因此挂载/ media / backup2意味着它将两个设备都计为挂载。

使用grep -q /media/backup2\ /proc/mounts以类似的方式工作,或者至少产生相同的结果,只是没有命名问题。

我也改变了if语句的工作方式,它现在检查SD卡,如果失败,则中止。然后,它以相当简单的流程检查安装了哪些设备。

以下是代码:

GNU nano 2.2.6文件:backupSD2.sh已修改

#!/bin/bash

#Check for SD

if ! grep -q /media/card\  /proc/mounts
then
    echo "ERROR: NO SD CARD"
    exit 0
else
    echo "SD OKAY..."
fi

#Check for Backup Devices

if (( grep -q /media/backup\  /proc/mounts ) && ( grep -q /media/backup2\  /proc/mounts ))
then
    echo "Both Backups mounted"

elif grep -q /media/backup\  /proc/mounts
then
    echo "CAUTION: Backup_2 missing, Backup_1 OKAY"

elif grep -q /media/backup2\  /proc/mounts
then
    echo "CAUTION: Backup_1 missing, Backup_2 OKAY"
else
    echo "ERROR: NO BACKUP DEVICES"
    exit 0
fi

'回声'命令是我将放置rsync命令的地方。 最终的exit 0可能是不必要的,但我不认为它会造成任何伤害,并保证它不会再尝试任何命令。

答案 1 :(得分:0)

使用mountpoint,如果路径是已装入的设备,则返回成功(0),否则返回1

#!/bin/bash

check_mountpoint(){
if  mountpoint -q $1
  then
                printf "%s\n" "$1 is mounted"
                return 0
            else
                printf "%s\n" "$1 is not mounted"
                return 1
fi
}

check_mountpoint /media/sd 
if [ $? -gt 0 ]
  then
    printf "%s\n" "aborting"
    exit 0
fi
check_mountpoint /media/backup1
check_mountpoint /media/backup2

这是你的代码更正,我希望它会有所帮助。

if mountpoint -q /media/sd
  then
    if mountpoint -q /media/backup
      then
        if mountpoint -q /media/backup2
          then
            echo "SUCCESS: All devices OKAY"
            # run your command here
          else
            echo "CAUTION: Backup_2 missing, Backup_1 OKAY, SD OKAY"
            # run your command here
        fi
      else
       if mountpoint -q /media/backup2
          then
            echo "CAUTION: Backup_1 missing, Backup_2 OKAY, SD OKAY"
            # run your command here
          else
            echo "SD OKAY , BACKUP Devices missing"
        fi
    fi
  else
    echo "SD is missing , Exit"
fi

答案 2 :(得分:0)

类似的东西:

die() {
    echo "$0[$$] ERROR: $@" >&2
    exit 1
}

grep -q /media/card\ /proc/mounts || die "/media/card not mounted"
grep -q /media/backup2?\ /proc/mounts || die "No backup devices"
grep -q /media/backup\ /proc/mounts || echo "CAUTION: Backup_1 missing, Backup_2 OKAY"
grep -q /media/backup\ /proc/mounts &&
    grep -q /media/backup2\ /proc/mounts &&
    echo "SUCCESS: All devices OKAY"