#!/bin/bash
usage ()
{
echo "run with 1st argument
-mux2 or mux4 or mux8 or default(mux2) or all ( all the 3 mux)"
echo "2nd argument
-struct or ifs or cases or asgn or default(struct) or all(all the
conditions)"
echo "3rd argument
-on (waveform) or off (no wave) or default(off)'
echo "run
- should take mux2 struct off as arguments"
}
if [ "$1" == "mux2" -o "$1" == "mux4" -o "$1" == "mux8" ]; then
if [ "$2" == "struct" -o "$2" == "ifs" -o "$2" == "cases" -o "$2"=="asgn" ]; then
if [ "$3" == "on" ]; then
iverilog -o mux "$1".v "$1"TB.v -D "$2"
vvp mux
gtkwave T.vcd
elif [ "$3" == "off" -o "$3" == "" ]; then
iverilog -o mux "$1".v "$1"TB.v -D "$2"
vvp mux
else
usage
fi
elif [ "$2" == "all" ]; then
$0 $1 struct $3
$0 $1 ifs $3
$0 $1 cases $3
$0 $1 asgn $3
elif [ "$2" =="" ]; then
$0 $2 struct $3
else
usage
fi
elif [ "$1" == "all" ]; then
$0 mux2 $2 $3
$0 mux4 $2 $3
$0 mux8 $2 $3
elif [ "$1" == "" ]; then
$0 mux2 stuct
else
usage
fi
Die Verwendung wird mehr als einmal angezeigt, wenn ich ein Skript mit den folgenden Argumenten ausführe:
run all jhjjk
run all all kjkj
Wie kann ich die Nutzung so einrichten, dass sie nur einmal ausgedruckt wird?
Antwort1
Um Parameter und Optionen in Ihrem Skript zu analysieren, würde ich verwendengetopts. Es bietet die von Ihnen gesuchte Funktionalität.
Damit Ihr Skript ausgeführt wird, fügen Sie exit
nach dieser Zeile Folgendes hinzu:
echo "run
- should take mux2 struct off as arguments"
exit
}
Antwort2
Nach steht ein Tippfehler default(off)
, da Sie '
statt haben "
. Abgesehen davon funktioniert es bei mir einwandfrei. Ich habe die meisten Befehle auskommentiert und echo
s zum Debuggen eingefügt. Es ist oft sinnvoll, ein minimales Beispiel zu erstellen. In diesem Fall hat die Verwendung all
als erstes Argument einwandfrei funktioniert. Hier ist Ihr Originalskript mit der "
Korrektur und mit besserer Einrückung, was das Debuggen viel einfacher macht.
#!/bin/bash
usage ()
{
echo "run with 1st argument
-mux2 or mux4 or mux8 or default(mux2) or all ( all the 3 mux)"
echo "2nd argument
-struct or ifs or cases or asgn or default(struct) or all(all the conditions)"
echo "3rd argument
-on (waveform) or off (no wave) or default(off)"
echo "run
- should take mux2 struct off as arguments"
}
if [ "$1" == "mux2" -o "$1" == "mux4" -o "$1" == "mux8" ]; then
if [ "$2" == "struct" -o "$2" == "ifs" -o "$2" == "cases" -o "$2"=="asgn" ]; then
if [ "$3" == "on" ]; then
iverilog -o mux "$1".v "$1"TB.v -D "$2"
vvp mux
gtkwave T.vcd
elif [ "$3" == "off" -o "$3" == "" ]; then
iverilog -o mux "$1".v "$1"TB.v -D "$2"
vvp mux
else
usage
fi
elif [ "$2" == "all" ]; then
$0 $1 struct $3
$0 $1 ifs $3
$0 $1 cases $3
$0 $1 asgn $3
elif [ "$2" =="" ]; then
$0 $2 struct $3
else
usage
fi
elif [ "$1" == "all" ]; then
$0 mux2 $2 $3
$0 mux4 $2 $3
$0 mux8 $2 $3
elif [ "$1" == "" ]; then
$0 mux2 stuct
else
usage
fi
Und hier ist eine Version, die ich verwendet habe und die einwandfrei funktioniert.
#!/bin/bash
usage ()
{
echo "run with 1st argument
-mux2 or mux4 or mux8 or default(mux2) or all ( all the 3 mux)"
echo "2nd argument
-struct or ifs or cases or asgn or default(struct) or all(all the conditions)"
echo "3rd argument
-on (waveform) or off (no wave) or default(off)"
echo "run
- should take mux2 struct off as arguments"
}
if [ "$1" == "mux2" -o "$1" == "mux4" -o "$1" == "mux8" ]; then
if [ "$2" == "struct" -o "$2" == "ifs" -o "$2" == "cases" -o "$2"=="asgn" ]; then
if [ "$3" == "on" ]; then
# iverilog -o mux "$1".v "$1"TB.v -D "$2"
# vvp mux
# gtkwave T.vcd
echo 1
elif [ "$3" == "off" -o "$3" == "" ]; then
# iverilog -o mux "$1".v "$1"TB.v -D "$2"
# vvp mux
echo 2
else
usage
fi
elif [ "$2" == "all" ]; then
# $0 $1 struct $3
# $0 $1 ifs $3
# $0 $1 cases $3
# $0 $1 asgn $3
echo 3
elif [ "$2" =="" ]; then
# $0 $2 struct $3
echo 4
else
usage
fi
elif [ "$1" == "all" ]; then
# $0 mux2 $2 $3
# $0 mux4 $2 $3
# $0 mux8 $2 $3
echo 5
elif [ "$1" == "" ]; then
# $0 mux2 stuct
echo 6
else
usage
fi
run all jhjjk
und run all all kjkj
beide kehren 5
wie erwartet zurück.
BEARBEITEN
Der einfachste Weg, aus der rekursiven Hölle herauszukommen, wie sie geschaffen wurde durch
$0 mux2 $2 $3
$0 mux4 $2 $3
$0 mux8 $2 $3
besteht darin, jede Befehlsgruppe zu einer Subroutine zu machen. Verwenden Sie dann die Verzweigungsstruktur, um diese Subroutine aufzurufen, oder drucken Sie die Verwendung aus, wenn sie unsinnig ist. Meiner Meinung nach ist Rekursion für diese Aufgabe einfach zu chaotisch.
Antwort3
Ich bevorzuge die Verwendung einer Funktion, aber wenn Sie eine rekursive Lösung verwenden müssen:
#!/bin/bash
usage()
{
echo Usage without recursive check
if [ "${USAGE_PRINTED}" = "notyet" ]; then
echo Usage xxxx
export USAGE_PRINTED="Yes the operator already understands it"
else
echo "ok"
fi
}
if [ -z "${USAGE_PRINTED}" ]; then
export USAGE_PRINTED="notyet"
fi
if [ $# -gt 1 ]; then
echo Parameters $*
usage
shift
$0 $*
else
echo Parameters $*
usage
fi
Ausgabe, wenn Sie dieses Programm mit den Parametern 1 2 3 4 ausführen:
Parameters 1 2 3 4
Usage without recursive check
Usage xxxx
Parameters 2 3 4
Usage without recursive check
ok
Parameters 3 4
Usage without recursive check
ok
Parameters 4
Usage without recursive check
ok
Die Zeilen mit "Verwendung ohne rekursive Prüfung" demonstrieren das Problem. Das Verschieben der Parameter dient dazu, den rekursiven Aufruf nach einigen Schritten zu beenden. Das Echo "ok" kann gelöscht werden.