2016-06-02 11 views
3

In einem Server mit bash Version 3 Ich tue dies:Der gleiche Tilde Operator funktioniert nicht in bash 4

bash3$ e="tar xfz"; [[ "$e" =~ "^tar" ]] && echo 0 || echo 1 
0 

Aber wenn ich ausführen den gleichen Befehl in bash Version 4

bash4$ e="tar xfz"; [[ "$e" =~ "^tar" ]] && echo 0 || echo 1 
1 

I habe es in CentOS, Fedora und Ubuntu versucht und die gleichen Ergebnisse erzielt. Was ist falsch?

Antwort

6

Zitiert den Abschnitt über reguläre Ausdrücke aus Greg's Wiki:

Vor 3.2 war es sicher Ihre RegexMuster in Anführungszeichen zu wickeln, aber dies in 3.2 geändert hat. Seitdem sollte Regex immer nicht in Anführungszeichen gesetzt werden.

Dies ist die Art und Weise kompatibel =~ der Verwendung:

e='tar xfz' 
re='^tar' 
[[ $e =~ $re ]] && echo 0 || echo 1 

Diese auf beiden Versionen von bash funktionieren sollen.

1

In diesem Fall, wo man nur sicherstellen möchten, dass Ihre Parameter mit tar beginnt, brauchen Sie nicht reguläre Ausdrücke, funktioniert einfach Mustervergleich als auch:

e='tar xfz' 
[[ $e == tar* ]] && echo 0 || echo 1