Regex Shell变量匹配
我需要一些脚本方面的帮助。我希望这个脚本回显“Det funkar med serier”到我的日志文件中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
#!/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*
,因为=~
匹配子字符串