Um dies zu beheben Befehl einen Fehler in weniger mit der Feststellung Nr. von Parametern
-
22-08-2019 - |
Frage
Diese Frage beruht auf dieses Themas .
Der Code
function man()
{
man "$1" > /tmp/manual; less /tmp/manual
}
Problem: , wenn ich auch nur eine Option verwenden, wird der Befehl nicht wissen, wo die wanted-Handbuch
Zum Beispiel
man -k find
ist mir ein Fehler, da die Referenz falsch. Der Befehl liest -k
als Handbuch.
Mein Versuch, das Problem in Pseudo-Code
zu lösenif no parameters
run the initial code
if one parameter
run: man "$2"
...
Mit anderen Worten, wir müssen einen Option-Scheck an den Anfang, so dass
hinzufügenPseudo-Code
man $optional-option(s) "$n" > /tmp/manual; less /tmp/manual
wobei $ n
- n = 1, wenn Null-Optionen
- n = 2, wenn 1 Option
- n = 3, wenn zwei Optionen
- ....
Wie können Sie eine solche "Option-check", dass Sie den Wert von n $ verändern kann?
Entwickelte Problem: zu bilden, wenn zwei Schleifen für die Situationen, die von n = 1 bis n = 2
Lösung
Wie wäre es, alle Argumente zu übergeben
function man()
{
man $@ > /tmp/manual; less /tmp/manual
}
Was ist der Fehler in weniger, die Sie im Titel erwähnt?
Andere Tipps
Erstens können Sie alle Ihre Funktion Argumente übergeben, indem Sie man
oder $*
$@
. Sie können man sh
für die genauen Details über den Unterschied zwischen den beiden lesen; Kurzgeschichte ist fast immer "$@"
mit doppelten Anführungszeichen zu verwenden.
Zweitens ist die temporäre Datei nicht erforderlich. Sie könnten diese ein wenig sauberer machen, indem die Ausgabe von man
direkt an less
kochend:
function man() {
man "$@" | less
}
By the way, wenn Sie nur einen anderen Pager zu verwenden versuchen (man
verwendet more
und Sie möchten die Züchter less
) gibt es eine allgemein anerkannte PAGER
Umgebungsvariable, die Sie festlegen können, die Standard-Pager zu überschreiben. Man könnte dies zu Ihrem ~/.bashrc
hinzufügen zum Beispiel alle Programme zu sagen less
zu verwenden, wenn mehrere Bildschirme der Ausgabe angezeigt wird:
export PAGER=less
Um Ihre genaue Frage zu beantworten, können Sie die Anzahl der Argumente mit $#
überprüfen:
if [ $# -eq 0 ]; then
: # No arguments
elif [ $# -eq 1 ]; then
: # One argument
# etc.
Sie können auch die shift
Befehl hilfreich. Es umbenennt $2
$1
, $3
$2
, und so weiter. Es wird oft in einer Schleife verwendet, um Befehlszeilenargumente nacheinander zu verarbeiten:
while [ $# -gt 1 ]; do
echo "Next argument is: $1"
shift
done
echo "Last argument is: $1"