我很难解决我从脚本中得到的错误,我正试图暂停我的机器。我试图在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]
,所有都有相同的错误。
答案 0 :(得分:6)
此问题不是由您的脚本引起的,而是由您调用它的方式引起的:
sh dbussuspend.sh
应该是:
bash dbussuspend.sh
bash
知道如何[[
,但sh
没有......
更好的是,按照Gordon Davisson的建议。这样做一次:
chmod +x dbussuspend.sh
然后,这样调用:
./dbussuspend.sh
另外,Etan Reisner和chepner质疑您使用expr
和laurel bash
正则表达式。 GNU coreutils sleep
支持例如sleep 30s
,sleep 2m
,sleep 1h
。使用man sleep
在您的系统上进行检查。如果是这样,那么这将有效:
elif [[ "$sustime" =~ ^[0-9]+[smhd]$ ]]
then
sudo sleep $sustime ; sudo pm-suspend
^
中$
和^[0-9]+[smhd]$
匹配字符串的开头和结尾,并阻止匹配,例如“uzeifue 1s ziufzr”。)