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 $1
den 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 10
gibt 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
}
- Dadurch wird die Variable
branch
als lokal für die Funktion deklariert. Dies ist nicht erforderlich, aber eine gute Angewohnheit. - Dieser Test (
[[ $1 ]]
) gibt false zurück, wenn$1
nicht 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 "" ]
- Auch hier gab es einen Syntaxfehler - fehlende Leerzeichen. Sollte lauten
- Beim
read
Verarbeiten einer Variablen verwenden Sie den Variablennamen (branch
), nicht ihren Inhalt ($branch
). - 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
- Wenn Sie jedoch dem Argument-Array eine Zuweisung zuweisen müssen, können Sie Folgendes verwenden:
- 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
...