grepstr()
{
grep "$1 $2" $TMP/"ORACLE_SID"_dbmode.txt > /dev/null 2>$1
}
- Was bedeutet der obige Befehl?
- Was sind
$1
und$2
? Warum ist es notwendig? - Gibt es Alternativen für die Verwendung
$1
und$2
?
grepstr()
{
grep "$1 $2" $TMP/"ORACLE_SID"_dbmode.txt > /dev/null 2>$1
}
$1
und $2
? Warum ist es notwendig? $1
und $2
? Antworten:
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>$1
stattdessen ist es >/dev/null 2>&1
Dies 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/null
Dies 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.
$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 ...
.