Gibt einen einzelnen Wert von einer Shell-Skript-Funktion
-
01-10-2019 - |
Frage
Beispiel:
#!/bin/sh
a() {
R=f
ls -1 a*
[ "$?" == "1" ] && { R=t; }
echo $R
}
r=`a`
echo $r
$r
enthält t
oder f
sondern auch die Ausgabe des ls
Befehl.
Ich kann ls -1 a* >/dev/null 2>/dev/null
schreiben, aber wenn es ein komplexeres Skript, das zu Fehlern führen kann.
Gibt es eine Möglichkeit, einen einzelnen Wert von a()
zurück?
Lösung
Eine Shell-Funktion kann einen numerischen Wert zurück. Betrachten wir 0 und 1 statt 'f' und 't'
#!/bin/sh
a() {
R=0
ls -1 a*
[ "$?" == "1" ] && { R=1; }
return $R
}
a
r=$?
echo $r
Dies wird noch Schreib Ausgabe aus dem ls -1 a*
die Sie wahrscheinlich noch entsorgen wollen, aber der Wert von r
wird entweder 0 oder 1 und umfasst nicht die Ausgabe.
Die anderen Beispiele der Ausgabe entweder von einer Linie umgeleitet oder einen ganzen Block sind gut, und, wie andere vorgeschlagen, sollten Sie andere Möglichkeiten, um Test für Bedingungen kennen zu lernen (aber ich war der Annahme, die ls
war irgendwie ein beliebiges Beispiel )
Andere Tipps
Sie müssen nicht ls
verwenden für Dateien zu überprüfen, mit a
starten. Verwenden Sie einfach die Shell
a() {
shopt -s nullglob
ret="f"
for file in a*
do
ret="t"
break
done
echo "$ret"
}
können Sie eine Umleitung auf eine Liste von Befehlen setzen:
{ command1 command2 } >/dev/null
Wenn an einem bestimmten Punkt im Skript Sie keine Ausgabe von nachfolgenden Befehlen mögen, können Sie die Shell des Ausgangs mit dem exec
builtin umleiten:
echo interesting exec >/dev/null echo boring
Beachten Sie, dass diese bis zum Ende des Skripts dauern, nicht nur bis zum Ende einer Funktion. Diese kümmert sich um Befehle nach dem interessant, aber nicht vor.
Es gibt einen Weg, um die Wirkung von exec /dev/null
zurückzukehren, durch Dateideskriptors Manipulationen verwendet. Ich notwendigerweise es allerdings nicht empfehlen, da es schwierig sein kann, in der Praxis zu erarbeiten. Die Idee ist, zu verlagern, was auch immer auf die Standardausgabe an einen anderen Deskriptor verbunden ist, dann die Standardausgabe in eine andere Datei umleiten, und schließlich die ursprüngliche Standardausgabe zurück auf die Standardausgabe verlagern.
{ exec 3>&1 # duplicate fd 3 to fd 1 (standard output) exec >/dev/null # connect standard output to /dev/null echo boring exec 1>&3 # connect standard output back to what was saved in fd 3 echo interesting exec >/dev/null # connect standard output to /dev/null again echo more boring } 3>/dev/null # The braced list must have its fd 3 connected somewhere, # even though nothing will actually be written to it.
a() {
ls -1 a* > /dev/null
[ "$?" == "0" ] && echo t || echo f
}
r=`a`
echo $r
Betrachten Sie mit [-f Dateiname] und andere Datei Tests als auch.