2016-05-22 20 views
1

Ich möchte Hello World zu hello world vergleichen. Das Ergebnis sollte stimmen, als wären sie gleich. Ich tue:Vergleichen Zeichenfolgen fallunabhängig

while read line; do 

    newLine="$newLine$line" 
done < $1 

newp="Hello World" 
if ((${newp,,}==${newLine,,})); then 
    echo "true" 
else 
    echo "false" 

fi 

, wenn ich eine Textdatei übergeben, bestehend aus:

#filename: file.txt 

hello world 

Der Ausgang scheint zu sein:

./testScript.txt: line 20: 0à»: hello world==hello world : syntax error in expression (error token is "world==hello world ") 
+ echo false 

Was mache ich falsch hier? Auch, ein wenig unabhängig, gibt es eine Möglichkeit, die Zeile, die in file.txt ist, an eine Zeichenfolge (newLine) übergeben, ohne dass while getan habe ich getan?

+1

'((a == b))' ist für Mathematik und Zahlen. '[[" $ a "=" $ b "]]] steht für Strings. Die Leerzeichen sind nicht optional. –

+0

Auch wenn Sie eine Antwort auf Ihre spezifische Frage erhalten, bedeutet die umgebende Schleife, dass jeder Test sagt, dass xy ​​mit xy übereinstimmt und andere falsche [mis] Übereinstimmungen haben kann. Siehe [why-is-using-a-shell-loop-to-process-text-built-bad-practice] (http://unix.stackexchange.com/questions/169716/why-is-using-a-shell) -loop-to-process-text-betrachtet-schlechte-Praxis). –

+0

Sie können 'grep -v' mit einem Stil von' Hallo Welt' verwenden, um den anderen Stil zu testen. – boardrider

Antwort

7

Sie sollten Kommas hinzufügen und die doppelten Klammern in einzelne Klammern ändern. Die if-Anweisung sollte so etwas wie:

if [ "${newp,,}" = "${newLine,,}" ]; then 

Und in Bezug auf diese while-Schleife ... Es hängt davon ab, was Sie tun wollen. Wenn man, wie in diesem Fall möchten Sie die gesamte Datei erhalten und es als einzelne Zeichenfolge speichern, können Sie einfach tun:

line=$(cat $1) 

würde ich vorschlagen, Sie nur diese Schleife verwenden Sie geschrieben haben, wenn Sie zu analysieren versuchen, die Datei zeilenweise, dh if-Anweisungen hinzufügen, verschiedene Variablen verwenden usw. Aber für einen einfachen Fall wie diesen, cat wird es gut gehen.

+0

Super, danke. – LamaEu

+0

Die umgebende Schleife bedeutet, dass dieser Test sagt, dass 'x \ y' mit' xy' übereinstimmt und andere falsche Übereinstimmungen haben kann. Siehe [why-is-using-a-shell-loop-to-process-text-built-bad-practice] (http://unix.stackexchange.com/questions/169716/why-is-using-a-shell) -loop-to-process-text-betrachtet-schlechte-Praxis). –

0

Es gibt eine shell option, nocasematch, die für die Verwendung mit [[ und case passenden Groß- und Kleinschreibung Muster ermöglicht.

Strings vergleichen, die nur durch das Gehäuse unterscheiden:

$ var1=lowercase 
$ var2=LOWERCASE 
$ [[ $var1 == $var2 ]] && echo "Matches!" || echo "Doesn't match!" 
Doesn't match! 

nun die Shell-Option aktiviert und versucht, wieder:

$ shopt -s nocasematch 
$ [[ $var1 == $var2 ]] && echo "Matches!" || echo "Doesn't match!" 
Matches! 

nur sicher, dass es wieder auszuschalten, mit shopt -u nocasematch, wenn Sie nicht tun wollen alle Vergleiche Groß-und Kleinschreibung.

Verwandte Themen