grep-Befehl in Bash-Scripting

0
grepstr()
{
 grep "$1 $2" $TMP/"ORACLE_SID"_dbmode.txt > /dev/null 2>$1
}
  1. Was bedeutet der obige Befehl?
  2. Was sind $1 und $2? Warum ist es notwendig?
  3. Gibt es Alternativen für die Verwendung $1 und $2?
Galvin Verghese
quelle

Antworten:

3

Ist der Code genau so?

So wie es ist, ist es eine Funktion, die zwei Argumente akzeptiert, sagen wir, sie sind arg1 und arg2.

Dann liest es eine Datei namens ORACLE_SID_dbmode.txt und druckt jede Zeile, die enthält arg1 arg2 (verbunden mit einem Leerzeichen dazwischen) und speichert die Fehlermeldungen in einer Datei mit dem Namen arg1.

Das ist ziemlich verwirrend, daher denke ich nicht, dass dies der eigentliche Code ist.

Ich würde mir vorstellen, dass es tatsächlich so ist:

grepstr()
{
    grep "$1" "$2" $TMP/"$ORACLE_SID"_dbmode.txt >/dev/null 2>&1
}

Änderungen:

  • "$1 $2" wird "$1" "$2"
  • ORACLE_SID wird $ORACLE_SID
  • 2>$1 wird 2>&1

In diesem Fall kann es auf zwei Arten verwendet werden:

grepstr options string_or_pattern

zum Beispiel:

grepstr -i something

würde es alle Zeilen in der Datei drucken (siehe unten) "$ORACLE_SID"_dbmode.txt das schließt die Zeichenfolge ein something, Something, SOMETHING, usw.

-i bedeutet Groß- und Kleinschreibung und ist nur ein Beispiel; Es kann jede Option verwendet werden.

(Auch technisch something ist zum Beispiel keine Zeichenfolge, sondern ein Muster [0-9] würde mit jeder Ziffer übereinstimmen).

Der zweite Weg ist:

grepstr string_or_pattern filename

In diesem Fall werden alle Zeilen gedruckt, die mit string_or_pattern in übereinstimmen filename oder "$ORACLE_SID"_dbmode.txt.

Das scheint weniger wahrscheinlich, aber es ist möglich, je nachdem, wie der Code verwendet wird.

Es könnte auch so genannt werden:

grepstr option1 option2

Dies würde jedoch von der Standardeingabe (z. B. der Standardtastatur) gelesen und alle darin enthaltenen Zeilen gedruckt "$ORACLE_SID"_dbmode.txt, was mit ziemlicher Sicherheit nicht das ist, was beabsichtigt war, gegeben "$ORACLE_SID"_dbmode.txt sieht aus wie ein Dateiname, keine Zeichenfolge oder Muster, die übereinstimmen sollen.

Wenn meine Vermutung stimmt, stimmt der Code nicht >/dev/null 2>$1stattdessen ist es >/dev/null 2>&1Dies bedeutet, dass Ausgabe- und Fehlermeldungen nicht gedruckt werden.

>/dev/null bedeutet, dass die Standardausgabe von grep (d. h. die übereinstimmenden Zeilen) an gesendet wird /dev/nullDies ist eine spezielle Datei, die vom Betriebssystem ignoriert wird.

2>&1 nach dem >/dev/null bedeutet, dass Fehlermeldungen auch dorthin gehen.

Wenn also die Ausgabe nicht wichtig ist, grepstr wird wahrscheinlich entweder so genannt:

if grepstr...

oder so:

grepstr...
if [ $? -ne 0 ]

Code nur ausführen, wenn eine Übereinstimmung vorliegt.

Zur Beantwortung des anderen Teils Ihrer Frage: Ja, es könnte in geändert werden

grepstr()
{
    grep "$@" $TMP/"$ORACLE_SID"_dbmode.txt > /dev/null 2>&1
}

Das "$@" erweitert um "$1" "$2" "$3"... (d. h. so viele Argumente wie angegeben).

Ich denke, das wäre besser, weil es flexibler wäre.

Andererseits, wenn es aus irgendeinem Grund zwei Argumente erfordert, an die ich nicht denken kann, dann vielleicht "$1" "$2" ist das, was der Autor beabsichtigt hat.

Mikel
quelle
0

$1 und $2 sind Parameter. Ihr Snippet definiert die Funktion grepstr.

Zum Beispiel läuft

grepstr first second

Tatsächlich wird der Befehl ausgeführt

grep "first second" $TMP/"ORACLE_SID"_dbmode.txt

und leitet die Ausgabe an um /dev/null (was Nachrichtensenke ist, alles, was dort abgelegt ist, verschwindet einfach).

Grundsätzlich, wenn Sie Skript (oder Funktion) ausführen, $1, $2, $3 (usw.) sind Parameter, die Sie angegeben haben. Sie können testen, ob der Parameter mit gesetzt ist -z, zum Beispiel if [ -z $3 ]; then ....

Olli
quelle