2017-01-24 3 views
1

Ich brauche Hilfe mit einem Skript. Ich möchte, dass dieses Skript "Det funkar med serier" in meine Protokolldatei einfügt.Shell variable match

#!/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 

Ausgabe in der Protokolldatei.

2 = Family.Guy.S10E08.HDTV.Custom.HebSub.XviD-Extinct 
3 = /media/store0/Serier/Family_Guy 
Det funkar INTE 

Wie man sehen kann ich die Regex in dem $ SERIER1 Variable erhalten kann nicht zu arbeiten, und ich kann nicht finden, wie es zu lösen.

Ich möchte, dass die If-Bedingung /media/store0/Serier/Family_Guy von einem Regex in der Variable z. ^/media/store0/Serier

Wie bekomme ich das, wenn ein Teil

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

zu arbeiten?

+2

[shellcheck] (http://www.shellcheck.net) weist auf mehrere Probleme hin, wie zum Beispiel '[[..]]' in '/ bin/sh' undefiniert (benutze'/bin/bash') , und '2> & 1 >> $ LOGFILE' funktioniert nicht wie beabsichtigt (benutze' >> $ LOGFILE 2> & 1') –

+0

Ich werde/bin/bash testen, wenn ich nach Hause komme – junkyhlm

+0

Sie verwenden nicht-quoted Variablen in Ihrem Single-eckigen Bedingungen, die in Ihrem speziellen Fall möglicherweise kein Problem darstellen (keine Dateinamen mit Leerzeichen), sollten jedoch als robuster angegeben werden. Um das Debuggen zu erleichtern, fügen Sie "#!/Bin/bash -ue" als erste Zeile hinzu, um die Überprüfung der Variablenerweiterung zu aktivieren und bei Rückgabewerten, die nicht Null sind, Fail-Fasten zu aktivieren. Dies wird oft helfen zu erkennen, wo Probleme entstehen, indem Fehler nicht ignoriert werden. – Fred

Antwort

1

Beachten Sie, dass Ihre SERIER1 Variable nicht enthält eine Regexp. Es enthält einen Glob. Globs sind eine andere Musterspezifikationssprache wie Regexp, aber sie sind nicht kompatibel.

In glob bedeutet * null oder mehr von irgendetwas

In regexp, * bedeutet null oder mehr des vorherigen Zeichens

Diese Unterscheidung ist wichtig. Das Muster:

r* 

In glob Spiele rainbow und range und r

In regexp passt r und rr und rrrrrr

Also, das Muster, das Sie haben:

/media/store0/Serier* 

Will nur Übereinstimmung: /media/store0/Serier o r /media/store0/Serierrr oder /media/store0/Serierrrrrrr usw.

Ich nehme an, was Sie wollen, ist:

/media/store0/Serier.* 

Da in regexp . etwas bedeutet. Also .* bedeutet null oder mehr von allem, was * in glob entspricht.

+0

Wahr; das OP kann aber auch einen Glob mit dem Operator '=' in '[[...]]' verwenden. – chepner

+0

Danke, also brauche ich so etwas: SERIER1 =/media/store0/Serie /.* und dann elif [[$ 3 = ~ $ SERIER1]] habe ich recht? – junkyhlm

+0

@junkyhlm Ja. Oder als Chepner erwähnt, können Sie auch den Operator '=' mit glob statt '= ~' mit regexp – slebetman