Regex Shell变量匹配

Regex Shell变量匹配,regex,shell,variables,Regex,Shell,Variables,我需要一些脚本方面的帮助。我希望这个脚本回显“Det funkar med serier”到我的日志文件中 #!/bin/sh HDFILM1=/media/store1/HD-film HDFILM2=/media/store2/HD-film SERIER1="/media/store0/Serier*" SERIER2=/media/store2/Serier LOGFILE=/home/holmen/script/rtorrent_unrar_move_files.sh.log r

我需要一些脚本方面的帮助。我希望这个脚本回显“Det funkar med serier”到我的日志文件中

#!/bin/sh

HDFILM1=/media/store1/HD-film
HDFILM2=/media/store2/HD-film
SERIER1="/media/store0/Serier*"
SERIER2=/media/store2/Serier

LOGFILE=/home/holmen/script/rtorrent_unrar_move_files.sh.log

rm -rfv $LOGFILE
echo 2 = $2 2>&1 >> $LOGFILE
echo 3 = $3 2>&1 >> $LOGFILE

if [ $3 = $HDFILM1 ] || [ $3 = $HDFILM2 ]; then
        echo "Det funkar med filmer" 2>&1 >> $LOGFILE
elif [[ $3 =~ $SERIER1 ]]; then
        echo "Det funkar med serier" 2>&1 >> $LOGFILE
else
        echo "Det funkar INTE" 2>&1 >> $LOGFILE
fi
2 = Family.Guy.S10E08.HDTV.Custom.HebSub.XviD-Extinct
3 = /media/store0/Serier/Family_Guy
Det funkar INTE
日志文件中的输出

#!/bin/sh

HDFILM1=/media/store1/HD-film
HDFILM2=/media/store2/HD-film
SERIER1="/media/store0/Serier*"
SERIER2=/media/store2/Serier

LOGFILE=/home/holmen/script/rtorrent_unrar_move_files.sh.log

rm -rfv $LOGFILE
echo 2 = $2 2>&1 >> $LOGFILE
echo 3 = $3 2>&1 >> $LOGFILE

if [ $3 = $HDFILM1 ] || [ $3 = $HDFILM2 ]; then
        echo "Det funkar med filmer" 2>&1 >> $LOGFILE
elif [[ $3 =~ $SERIER1 ]]; then
        echo "Det funkar med serier" 2>&1 >> $LOGFILE
else
        echo "Det funkar INTE" 2>&1 >> $LOGFILE
fi
2 = Family.Guy.S10E08.HDTV.Custom.HebSub.XviD-Extinct
3 = /media/store0/Serier/Family_Guy
Det funkar INTE
正如您所见,我无法使$SERIER1变量中的正则表达式起作用,也无法找到解决方法

我希望if条件与变量中正则表达式中的/media/store0/Serier/Family\Guy匹配,例如^/media/store0/Serier

如何获得if部分

elif [[ $3 =~ $SERIER1 ]]; then

要工作吗?

请注意,
序列1
变量不包含regexp。它包含一个glob。Globs是另一种模式规范语言,如regexp,但它们不兼容

在glob中,
*
表示任何内容的零或更多

在regexp中,
*
表示前一个字符的零个或多个

这一区别很重要。模式:

r*
在glob中匹配彩虹和范围和r

在regexp中匹配
r
rr
rrrrrrr

那么,你的模式是:

/media/store0/Serier*
将仅匹配:
/media/store0/Serier
/media/store0/Serierrr
/media/store0/serierrrr

我想你想要的是:

/media/store0/Serier.*

因为在regexp
中意味着任何东西。因此,
*
意味着在glob中等同于
*
的任何事物的零或更多。

指出了一些问题,例如
[..]
/bin/sh
中未定义
/bin/bash>(使用
/bin/bash
),以及
2>&1>$LOGFILE
未按预期工作(使用
>$LOGFILE 2>&1
)当我回到家时,我将测试/bin/bash如果您在单括号条件中使用未加引号的变量,在您的特定情况下,这可能不是问题(没有包含空格的文件名),但应该加引号以使其更加健壮。要帮助调试,请尝试添加“#!/bin/bash-ue”作为第一行,以启用变量扩展检查,并在非零返回代码上快速失败。这通常有助于通过不让失败继续下去来了解问题的来源;OP也可以使用glob,不过里面有
=
操作符
[…]]
。谢谢,所以我需要这样的东西:SERIER1=/media/store0/Serier/*然后是elif[$3=~$SERIER1]]我说得对吗?@junkyhlm是的。或者正如chepner提到的,您也可以使用glob的
=
操作符,而不是regexp的
=~
。谢谢,明天将尝试:)如果正确,这不是阻止程序
/media/store0/Serier/Family\u Guy
匹配
/media/store0/Serier*
,因为
=~
匹配子字符串