bash if语句中的正则表达式

时间:2016-05-03 23:39:54

标签: regex bash

我很难解决我从脚本中得到的错误,我正试图暂停我的机器。我试图在elif语句中使用正则表达式在特定时间段后暂停我的机器。

#!/bin/bash
echo "When would you like to suspend the machine?"
read "sustime"
if [ "$sustime" = "now" ]
then
    sudo pm-suspend
elif [[ "$sustime" =~ [0-9]*[smhd] ]]
then
    time=`expr "$sustime" : '\([0-9]+)\)'`
    ttype=`expr "$sustime" : '.*\([smhd]\)'`
    sudo sleep $time$ttype ; sudo pm-suspend
else
    echo "Please enter either [now] or [#s|m|h|d]"
fi

代码在elif行上不起作用,例如,如果我输入5s,则脚本的输出为:

$ sh dbussuspend.sh 
When would you like to suspend the machine?
5s
dbussuspend.sh: 10: dbussuspend.sh: [[: not found
Please enter either [now] or [#s|m|h|d]

但是,应该读到我已输入字符串5s运行elif下的代码块。我实际上尝试过任何正则表达式代替[0-9]*[smhd],所有都有相同的错误。

1 个答案:

答案 0 :(得分:6)

此问题不是由您的脚本引起的,而是由您调用它的方式引起的:

sh dbussuspend.sh

应该是:

bash dbussuspend.sh

bash知道如何[[,但sh没有......

更好的是,按照Gordon Davisson的建议。这样做一次:

chmod +x dbussuspend.sh

然后,这样调用:

./dbussuspend.sh

另外,Etan Reisnerchepner质疑您使用exprlaurel bash正则表达式。 GNU coreutils sleep支持例如sleep 30ssleep 2msleep 1h。使用man sleep在您的系统上进行检查。如果是这样,那么这将有效:

elif [[ "$sustime" =~ ^[0-9]+[smhd]$ ]]
then
    sudo sleep $sustime ; sudo pm-suspend

^$^[0-9]+[smhd]$匹配字符串的开头和结尾,并阻止匹配,例如“uzeifue 1s ziufzr”。)