Wie kann ich die Nutzung so einrichten, dass nur einmal gedruckt wird?

Wie kann ich die Nutzung so einrichten, dass nur einmal gedruckt wird?
#!/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 exitnach 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 echos zum Debuggen eingefügt. Es ist oft sinnvoll, ein minimales Beispiel zu erstellen. In diesem Fall hat die Verwendung allals 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 jhjjkund run all all kjkjbeide kehren 5wie 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.

verwandte Informationen