2015-05-24 88 views
1

我的代码有比较var与正则表达式的问题。bash正则表达式格式

的主要问题是问题是在这里

if [[ “$alarm” =~ ^[0-2][0-9]\:[0-5][0-9]$ ]] 

这个“如果”是不正确的,我不知道为什么,即使我通过像13:00或08:19的总是假“$报警”值并写入“无效时钟格式”。

当我尝试这个^ [0-2] [0-9]:[0-5] [0-9] $在现场测试正则表达式的工作,例如我用12:20进行了训练。

我开始我的剧本蒙山命令./alarm 11:12 下面是整个代码

#!/bin/bash 
masa="`date +%k:%M`" 
mp3="$HOME/Desktop/alarm.mp3" #change this 
echo "lol"; 
if [ $# != 1 ]; then 
echo "please insert alarm time [24hours format]" 
echo "example ./alarm 13:00 [will ring alarm at 1:00pm]" 
exit; 
fi 

alarm=$1 
echo "$alarm" 
#fix me with better regex >_< 
if [[ “$alarm” =~ ^[0-2][0-9]\:[0-5][0-9]$ ]] 
then 
echo "time now $masa" 
echo "alarm set to $alarm" 
echo "will play $mp3" 
else 
echo "invalid clock format" 
exit; 
fi 

while [ $masa != $alarm ];do 
masa="`date +%k:%M`" #update time 
sleep 1 #dont overload the cpu cycle 
done 

echo $masa 
if [ $masa = $alarm ];then 
echo ringggggggg 
play $mp3 > /dev/null 2> /dev/null & 
fi 
exit 
+4

你的问题在'$ alarm'周围使用了引号;那些实际在你的代码中,或者是你的问题中的错字?它们会被shell忽略,并被视为与正则表达式匹配的值的一部分,如果过度宽容(它允许像'25:00'这样的时间),这看起来很好。不过,您不需要转义':'。 – chepner

+0

Chepner是正确的。 –

回答

0

我可以看到一对夫妇的问题进行测试。

首先,看起来您可能会在变量周围使用错误的双引号(,而不是")。这些“花哨的引号”正与您的变量连接,我认为这是导致您的模式无法匹配的原因。你可以改变它们,但在bash的扩展测试中(即[[而不是[),不需要引用你的变量,所以我建议完全删除它们。其次,您的正则表达式现在允许一些无效的日期。我会建议使用这样的事情:

re='^([01][0-9]|2[0-3]):[0-5][0-9]$' 
if [[ $alarm =~ $re ]] 

我特意选择使用一个单独的变量来存储模式,因为这是在bash正则表达式工作的最广泛兼容的方式。