Warten auf Benutzereingaben

Warten auf Benutzereingaben

Ich erstelle eine kleine Funktion für einen Vorgang, den ich oft wiederholen muss.

Ich möchte, dass, wenn ich die Funktion ohne Parameter aufrufe, sie mir die Zweige anzeigt und mir erlaubt, den Prozess zu dem Zweig auszuführen, den ich eingegeben habe, und dass, wenn ich sie mit einem Parameter aufrufe, der Prozess direkt auf diesem Zweig ausgeführt wird

function 3bra(){
  #If there's no parameter
  if ["$1" -eq ""]; then
    #show me the branches
    git branch
    #wait for input and give the parameter such entered value
    read $1
  fi

  #checkout to the parameter branch
  git checkout "$1"

  if [ $? -eq 0 ]; then
    #if there are no errors, complete the checkout process
    npm i
    npm rebuild node-sass --force
    npm run start
  fi
}

Meine Frage ist, wie kann ich $1den Eingabewert angeben und auch beenden, wenn im Eingabewarteteil nichts angegeben ist

Antwort1

#!/bin/bash
branch=""
function 3bra(){
  #If there's no paramether
  if [[ -z "$*" ]]; then
    #show me the branches
    git branch
    #wait for input and give the paramether such entered value
    echo "Which branch?"
    read -t 10 branch || exit
  else
    #Stuff to do if 3bra is called with params...
    branch="$1"
  fi
  #checkout to the paramether branch
  git checkout "$branch"
  if [[ "$?" -eq 0 ]]; then
    #if there are no errors, complete the checkout process
    npm i
    npm rebuild node-sass --force
    npm run start
  fi
}
#Call the function and pass in the parameters.
3bra "$1"

Das read -t 10gibt ein Timeout von 10 Sekunden an. Wenn keine Eingabe erfolgt, wird das Skript beendet.

Vorausgesetzt, es gibt noch andere Dinge in diesem Skript, sonst würden Sie den Funktionsaufruf nicht wirklich brauchen. Speichern Sie das Skript und führen Sie es aus, indem Sie ein Argument übergeben. Das Argument wird, falls vorhanden, an die Funktion weitergeleitet.

Außerdem kenne ich mich mit Git nicht aus. Wenn also etwas Git-bezogenes an der falschen Stelle festhängt, ist das mein Fehler.

Antwort2

So würde ich es schreiben (mit Fußnoten):

function 3bra(){
  local branch  # (1)

  if [[ $1 ]]; then  # (2)
    branch="$1"
  else
    # Show branches.
    git branch
    # Get branch from user.
    read branch  # (3, 4)
  fi

  # Checkout the given branch.
  if git checkout "$branch"; then  # (5)
    # Complete the checkout process.
    npm i
    npm rebuild node-sass --force
    npm run start
  fi
}
  1. Dadurch wird die Variable branchals lokal für die Funktion deklariert. Dies ist nicht erforderlich, aber eine gute Angewohnheit.
  2. Dieser Test ( [[ $1 ]]) gibt false zurück, wenn $1nicht gesetzt oder null ist. Das ist eine prägnantere Möglichkeit, das zu tun, was Sie getan haben.
    • Auch hier gab es einen Syntaxfehler - fehlende Leerzeichen. Sollte lauten[ "$1" -eq "" ]
  3. Beim readVerarbeiten einer Variablen verwenden Sie den Variablennamen ( branch), nicht ihren Inhalt ( $branch).
  4. Es ist besser, eine benannte Variable als einen nummerierten Parameter zu verwenden.
    • Wenn Sie jedoch dem Argument-Array eine Zuweisung zuweisen müssen, können Sie Folgendes verwenden:set -- arg1 arg2
  5. Dadurch wird der Rückgabewert direkt getestet.

Wenn Sie wirklich gründlich sein möchten, geben Sie einen Fehler aus, wenn zu viele Argumente angegeben werden:

if [[ $# -gt 1 ]]; then
  echo "${FUNCNAME[0]}: Too many arguments" >&2
  return 1
fi

if [[ $1 ]]; then
...

verwandte Informationen