bash正则表达式格式

时间:2015-05-24 22:47:50

标签: regex bash

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

主要问题是问题在这里

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

这个“如果”永远不会是真的我不知道为什么即使我传递给“$ alarm”值如13:00或08:19它总是假的并且写“无效的时钟格式”。

当我尝试这个^ [0-2] [0-9]:[0-5] [0-9] $在网站上测试正则表达式时它的工作例如我用12:20编译。

我启动脚本whith命令./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

1 个答案:

答案 0 :(得分:0)

我可以看到你的测试有几个问题。

首先,看起来您可能在变量周围使用了错误的双引号( ,而不是")。这些“花哨的引号”正在与你的变量连接,我认为这是导致你的模式无法匹配的原因。您可以在bash的扩展测试中更改它们(即[[而不是[),无论如何都不需要引用您的变量,所以我建议完全删除它们。

其次,您的正则表达式目前允许一些无效日期。我建议使用这样的东西:

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

我故意选择使用单独的变量来存储模式,因为这是使用bash regex的最广泛兼容的方式。