Ich versuche, ein Bash-Skript zu schreiben, das eine Funktion enthält, die bei Vorliegen einer .tar
, .tar.bz2
, .tar.gz
usw. Datei tar mit den entsprechenden Schaltern verwendet, um die Datei zu dekomprimieren.
Ich verwende if elif then Anweisungen, die den Dateinamen testen, um zu sehen, womit er endet, und ich kann ihn nicht dazu bringen, mit Regex-Metacharakteren übereinzustimmen.
Um das Skript nicht ständig neu schreiben zu müssen, verwende ich 'test' in der Befehlszeile. Ich dachte, die unten stehende Anweisung sollte funktionieren, aber ich habe alle möglichen Kombinationen von Klammern, Anführungszeichen und Metacharater ausprobiert und trotzdem schlägt es fehl.
test sed-4.2.2.tar.bz2 = tar\.bz2$; echo $?
(this returns 1, false)
Ich bin mir sicher, dass das Problem ganz einfach ist, und ich habe überall nachgeschaut, aber ich weiß nicht, wie ich es machen soll. Weiß jemand, wie ich das machen kann?
Um Regexe abzugleichen, müssen Sie den Operator =~
verwenden.
Versuchen Sie dies:
[[ sed-4.2.2.tar.bz2 =~ tar.bz2$ ]] && echo matched
Alternativ können Sie Wildcards (anstelle von Regexen) mit dem Operator ==
verwenden:
[[ sed-4.2.2.tar.bz2 == *tar.bz2 ]] && echo matched
Wenn die Portabilität keine Rolle spielt, empfehle ich die Verwendung von [[
anstelle von [
oder test
, da dies sicherer und leistungsfähiger ist. Siehe [Was ist der Unterschied zwischen test, [ und [[ ?]1 für Details.
extract () {
if [ -f $1 ] ; then
case $1 in
*.tar.bz2) tar xvjf $1 ;;
*.tar.gz) tar xvzf $1 ;;
*.bz2) bunzip2 $1 ;;
*.rar) rar x $1 ;;
*.gz) gunzip $1 ;;
*.tar) tar xvf $1 ;;
*.tbz2) tar xvjf $1 ;;
*.tgz) tar xvzf $1 ;;
*.zip) unzip $1 ;;
*.Z) uncompress $1 ;;
*.7z) 7z x $1 ;;
*) echo "don't know '$1'..." ;;
esac
else
echo "'$1' is not a valid file!"
fi
}
Als Antwort auf Aquarius Power im obigen Kommentar, Wir müssen die Regex in einer var speichern
Die Variable BASH_REMATCH wird nach der Übereinstimmung mit dem Ausdruck gesetzt, und ${BASH_REMATCH[n]} entspricht der n-ten Gruppe, die in Klammern eingeschlossen ist, d.h. im Folgenden ${BASH_REMATCH[1]} = "compressed"
und ${BASH_REMATCH[2]} = ".gz"
if [[ "compressed.gz" =~ ^(.*)(\.[a-z]{1,5})$ ]];
then
echo ${BASH_REMATCH[2]} ;
else
echo "Not proper format";
fi
(Die obige Regex ist nicht als gültige Regex für Dateinamen und -erweiterungen gedacht, aber sie funktioniert für dieses Beispiel)
shopt -s nocasematch
if [[ sed-4.2.2.$LINE =~ (yes|y)$ ]]
then exit 0
fi