BASH 用于检查两个已安装驱动器的脚本 'unary operator expected'
BASH script to check for two mounted drives 'unary operator expected'
尝试编写一个 bash 脚本来检查两个已安装的驱动器,然后在两个驱动器都已连接时执行某些操作。到目前为止我有:
if [ $(mount | grep -c /media/card) != 1 ]
then
echo "ERROR: SD card not mounted"
sudo sh -c "echo timer > /sys/class/leds/led0/trigger"
sudo sh -c "echo 2000 > /sys/class/leds/led0/delay_on"
else
if [ $(mount | grep -c /media/backup) !=1 ]
then
echo "ERROR: Backup not mounted"
sudo sh -c "echo timer > /sys/class/leds/led0/trigger"
sudo sh -c "echo 2000 > /sys/class/leds/led0/delay_on"
else
echo "All Plugged in"
fi
fi
运行 returns 错误:
./backup2.sh: line 12: [: 0: unary operator expected
不确定为什么第一个 if
语句有效,但第二个却不起作用,因为它们基本相同。有没有更简洁的方法来检查两个已安装的设备?理想情况下输出一个错误,显示哪些未安装。
你需要在 !=
:
后面加上 space
if [ $(mount | grep -c /media/backup) !=1 ]
像这样:
if [ $(mount | grep -c /media/backup) != 1 ]
顺便说一句,如果您有超过 1 个已安装的驱动器匹配 /media/card
或 /media/backup
会怎样?
输出会产生误导,
说 "X is not mounted".
因此,将 != 1
条件替换为 == 0
似乎更有意义。
但如果你决定这样做,
然后有更好的方法来写条件,
直接使用管道的退出代码。
if ! mount | grep /media/card >/dev/null
then
echo "ERROR: SD card not mounted"
sudo sh -c "echo timer > /sys/class/leds/led0/trigger"
sudo sh -c "echo 2000 > /sys/class/leds/led0/delay_on"
elif ! mount | grep /media/backup >/dev/null
then
echo "ERROR: Backup not mounted"
sudo sh -c "echo timer > /sys/class/leds/led0/trigger"
sudo sh -c "echo 2000 > /sys/class/leds/led0/delay_on"
else
echo "All Plugged in"
fi
这是一个更简洁的代码 -- 删除了嵌套的 if
并使用 elif
代替并考虑了 janos
关于 space 需要的注释!=1
:
#!/bin/bash
if [ $(mount | grep -c /media/card) != 1 ]
then
echo "ERROR: SD card not mounted"
sudo sh -c "echo timer > /sys/class/leds/led0/trigger"
sudo sh -c "echo 2000 > /sys/class/leds/led0/delay_on"
elif [ $(mount | grep -c /media/backup) != 1 ]
then
echo "ERROR: Backup not mounted"
sudo sh -c "echo timer > /sys/class/leds/led0/trigger"
sudo sh -c "echo 2000 > /sys/class/leds/led0/delay_on"
else
echo "All Plugged in"
fi
似乎在 Red Hat 下运行良好6.x
尝试编写一个 bash 脚本来检查两个已安装的驱动器,然后在两个驱动器都已连接时执行某些操作。到目前为止我有:
if [ $(mount | grep -c /media/card) != 1 ]
then
echo "ERROR: SD card not mounted"
sudo sh -c "echo timer > /sys/class/leds/led0/trigger"
sudo sh -c "echo 2000 > /sys/class/leds/led0/delay_on"
else
if [ $(mount | grep -c /media/backup) !=1 ]
then
echo "ERROR: Backup not mounted"
sudo sh -c "echo timer > /sys/class/leds/led0/trigger"
sudo sh -c "echo 2000 > /sys/class/leds/led0/delay_on"
else
echo "All Plugged in"
fi
fi
运行 returns 错误:
./backup2.sh: line 12: [: 0: unary operator expected
不确定为什么第一个 if
语句有效,但第二个却不起作用,因为它们基本相同。有没有更简洁的方法来检查两个已安装的设备?理想情况下输出一个错误,显示哪些未安装。
你需要在 !=
:
if [ $(mount | grep -c /media/backup) !=1 ]
像这样:
if [ $(mount | grep -c /media/backup) != 1 ]
顺便说一句,如果您有超过 1 个已安装的驱动器匹配 /media/card
或 /media/backup
会怎样?
输出会产生误导,
说 "X is not mounted".
因此,将 != 1
条件替换为 == 0
似乎更有意义。
但如果你决定这样做,
然后有更好的方法来写条件,
直接使用管道的退出代码。
if ! mount | grep /media/card >/dev/null
then
echo "ERROR: SD card not mounted"
sudo sh -c "echo timer > /sys/class/leds/led0/trigger"
sudo sh -c "echo 2000 > /sys/class/leds/led0/delay_on"
elif ! mount | grep /media/backup >/dev/null
then
echo "ERROR: Backup not mounted"
sudo sh -c "echo timer > /sys/class/leds/led0/trigger"
sudo sh -c "echo 2000 > /sys/class/leds/led0/delay_on"
else
echo "All Plugged in"
fi
这是一个更简洁的代码 -- 删除了嵌套的 if
并使用 elif
代替并考虑了 janos
关于 space 需要的注释!=1
:
#!/bin/bash
if [ $(mount | grep -c /media/card) != 1 ]
then
echo "ERROR: SD card not mounted"
sudo sh -c "echo timer > /sys/class/leds/led0/trigger"
sudo sh -c "echo 2000 > /sys/class/leds/led0/delay_on"
elif [ $(mount | grep -c /media/backup) != 1 ]
then
echo "ERROR: Backup not mounted"
sudo sh -c "echo timer > /sys/class/leds/led0/trigger"
sudo sh -c "echo 2000 > /sys/class/leds/led0/delay_on"
else
echo "All Plugged in"
fi
似乎在 Red Hat 下运行良好6.x