Wie kann ich ein Shell-Skript schreiben, bei dem bei der Befehlsausgabe die Groß- und Kleinschreibung nicht berücksichtigt wird?
shell-script
shell
string
Miguel Roque
quelle
quelle
grep -i
vielleicht?bash
ist eine Obermenge des Unix-Standardssh
. Sie können mit einem der folgenden Schritte beginnen: | 1 | | 2 | - nur um den tatsächlichen Kontext in den Griff zu bekommen.Antworten:
Hier ist zunächst ein einfaches Beispielskript, das Groß- und Kleinschreibung nicht ignoriert:
Versuchen Sie, die Zeichenfolge Hallo auf der rechten Seite zu ändern, und es sollte nicht mehr widerhallen
it works
. Versuchen Sie,echo hello
durch einen Befehl Ihrer Wahl zu ersetzen . Wenn Sie die Groß- / Kleinschreibung ignorieren möchten und keiner der beiden Strings einen Zeilenumbruch enthält, können Sie grep verwenden:Der Schlüssel hier ist, dass Sie eine Befehlsausgabe weiterleiten
grep
. Dieif
Anweisung testet den Beendigungsstatus des Befehls ganz rechts in einer Pipeline - in diesem Fall grep. Grep beendet sich nur dann mit Erfolg, wenn es eine Übereinstimmung findet.Die
-i
Option von grep sagt, Groß- und Kleinschreibung zu ignorieren.Die
-q
Option besagt, dass nach dem ersten Treffer keine Ausgabe erfolgen soll.In der
-F
Option wird angegeben, dass das Argument als Zeichenfolge und nicht als regulärer Ausdruck behandelt werden soll.Beachten Sie, dass das erste Beispiel direkte Vergleiche und verschiedene nützliche Operatoren ermöglicht. Die zweite Form führt nur Befehle aus und testet ihren Exit-Status.
[ expression ]
quelle
==
ist nicht POSIX.sh
ist nichtbash
auf allen Linux-basierten Systemen.==
wird nicht unterstützt vonash
(woraufsh
zumindest die von vielen BSDs und Debian-Derivaten basieren), oderposh
und muss in zitiert werdenzsh
. Es macht keinen Sinn, das zu verdoppeln=
.[
ist ein Befehl zum Testen. Hier muss nicht zwischen Zuordnung und Vergleich unterschieden werden. Das ist etwas anderes in(( a == b ))
vs(( a = b))
. Die Verwendung==
in einem Skript, das mit beginnt,#! /bin/sh
ist falsch. Wenn Sie davon ausgehen,ksh
oderbash
Syntax, aktualisieren Sie die#!
entsprechend.Wenn Sie die Shell-Option festlegen, können Sie den Teilstring-Abgleich ohne Berücksichtigung der Groß- und Kleinschreibung nativ
bash
mithilfe des Regex-Operators durchführen . Beispielsweise=~
nocasematch
quelle
[[ XYZ == xyz ]] && echo "match"
=>match
Bei einer Zeichenfolgensuche, bei der die Groß- und Kleinschreibung beachtet wird, wird der Wert der Variablen
needle
im Wert der Variablen wie folgt gesuchthaystack
:Konvertieren Sie für eine Suche nach Zeichenfolgen, bei der die Groß- und Kleinschreibung nicht beachtet wird, beide in dieselbe Groß- / Kleinschreibung.
Beachten Sie, dass die
tr
in GNU Coreutils keine Multibyte-Locales unterstützen (zB UTF-8). Verwenden Sie stattdessen awk, um mit Multibyte-Gebietsschemas zu arbeiten. Wenn Sie awk verwenden, können Sie den Zeichenfolgenvergleich und nicht nur die Konvertierung durchführen.Die
tr
from BusyBox unterstützt die Syntax nicht. Sie können stattdessen verwenden. BusyBox unterstützt keine Nicht-ASCII-Sprachumgebungen.[:CLASS:]
tr a-z A-Z
In bash (aber nicht in sh) gibt es eine integrierte Syntax für die Konvertierung von Groß- und Kleinschreibung und eine einfachere Syntax für den String-Abgleich.
quelle
printf | tr
lässt meinen Kopf herumwirbeln. Wenn möglich, beschränken Sie Ihren Aufruf von Befehlen auf ein Minimum. Mit einer Variablen v können Sie dasselbe erreichenv=$(tr '[:lower:]' '[:upper:]' <<<$v)
. Für diejenigen, die es noch nie zuvor gesehen haben, ist das<<<
im Wesentlichen eine "Hier-Variable", wie die Verwendung<<EOF
für ein Hier-Dokument. Tu es nichtprintf
oder nur,echo
wenn du es unbedingt tun musst.<<<
Operator haben: ksh, bash, zsh, aber nicht plain sh. Und es ist ziemlich nah dran,printf
wie es läuft: Es gibt die gleiche Anzahl von Aufrufen zufork
undexecve
(vorausgesetzt, dasprintf
ist eingebaut, was bei den meisten gebräuchlichen Shells der Fall ist); Ein Unterschied besteht darin, dass<<<
eine temporäre Datei erstellt wird, anstatt eine Pipe zu verwenden.<<<
ist bequem zu tippen, aber keine Leistungsverbesserung.