关闭 PC 并在使用 BASH 之前做一些事情

Turn off PC and do something before with BASH

我想在电池没电之前关闭电脑并复制一些文件。

#!/bin/bash
LOW=11460
BAT=`/bin/cat /proc/acpi/battery/BAT1/state | /bin/grep remaining | /usr/bin/awk '{print$3}'`
if ["$BAT" \< "$LOW"]
then
echo "Turning off"
rsync folder/ otherfolder/
shutdown -h now
fi

但是它不起作用!

您的语法不正确。您不必要地转义部分代码,并且在使用 [ 构造时,您的测试表达式需要变量周围的空格和数字比较。例如:

#!/bin/bash
LOW=11460
BAT=`/bin/cat /proc/acpi/battery/BAT1/state | /bin/grep remaining | /usr/bin/awk '{print }'`
if [ "$BAT" -lt "$LOW" ]
then
    echo "Turning off"
    rsync folder/ otherfolder/
    shutdown -h now
fi

假设 /bin/usr/bin 都在您的路径中,我将进行以下更改:

BAT=`cat /proc/acpi/battery/BAT1/state | grep remaining | awk '{print }'`

也考虑使用 (()) 作为测试表达式。例如

if ((BAT < LOW))

注意:BATLOW 周围的 空格在使用 (()) 测试结构时不需要,也不需要除非使用大括号扩展或数组语法,否则在 (()) 内使用 $ 取消引用变量。例如((${#array[@]} < something)).

此外,由于您调用的脚本需要 root 权限才能调用 shutdown,因此您应该在开头测试 root EUID

if ((EUID != 0)); then
    printf "error: script must be run by root, EUID: '%s' can't.\n" $EUID
    exit 0
fi

或者如果您更喜欢正常的 [ 测试结构:

if [ $EUID -ne 0 ]; then
...