Wie kann ich ein Bash-Skript veranlassen, Eingaben zu machen, bevor das Skript aufgerufen wird?


7

Grundsätzlich rufen Sie mein Bash-Skript auf, indem Sie mybashscriptin die Konsole tippen. Dann geht es los:

Welcome to mybashcript! Choose an option (login|logout|view|erase|quit|):

Der Benutzer gibt dann die gewünschten Eingaben ein, die dann ein Python-Skript weiter unten in der jeweiligen if-Struktur der jeweiligen Option aktivieren.

Was ich mich wundere ist, wie kann ich es so machen, dass der Benutzer nur etwas wie mybashscript loginoder eingeben muss (wenn er das Programm vorher benutzt hat) mybashscript view.

Jedes Wort, das nach dem Namen des Bash-Skripts hinzugefügt wird, wird dann als erste Eingabe im Skript selbst verwendet. Ist das möglich?

Hier ist mein Skript, ich verstehe nicht genau, wie man $ 1 einfügt, ohne es auch fragen zu lassen, ob es kein Argument gibt.

#!/bin/bash

echo -n "Hello $USER, welcome to the guestbook! Choose an option (sign|view|save|erase):     "

read option

if [ "$option" == "sign" ]; then
  python /usr/local/bin/guestbook.data/sign_guestbook.py

 elif [ "$option" == "view" ]; then
  python /usr/local/bin/guestbook.data/view_guestbook.py

 elif [ "$option" == "save" ]; then
  python /usr/local/bin/guestbook.data/save_guestbook.py

 elif [ "$option" == "erase" ]; then
  python /usr/local/bin/guestbook.data/erase_guestbook.py

 else
  echo "Sorry, I didn't understand that." 

fi

1
Die Argumente sind $ 0 für den Namen des Programms, $ 1, $ 2… für andere Argumente, $ # für die Anzahl der Argumente, $ * für alle Argumente von 1, $ @ als $ *, aber wenn in Anführungszeichen, werden die Argumente getrennt. Außerdem shiftlöscht der Befehl $ 1 und verschiebt die anderen nach unten, $ 2 wird zu $ ​​1, $ 3 wird zu $ ​​2…
ctrl-alt-delor

Antworten:


14
#!/bin/bash

case $# in
0) echo -n "Hello $USER, welcome to the guestbook! Choose an option (sign|view|save|erase):     "
   read option ;;

1) option=$1 ;;

*) echo "Sorry, I didn't understand that (too many command line arguments)"
   exit 2 ;;

esac

if [ "$option" == "sign" ]; then
  python /usr/local/bin/guestbook.data/sign_guestbook.py

elif [ "$option" == "view" ]; then
  python /usr/local/bin/guestbook.data/view_guestbook.py

elif [ "$option" == "save" ]; then
  python /usr/local/bin/guestbook.data/save_guestbook.py

elif [ "$option" == "erase" ]; then
  python /usr/local/bin/guestbook.data/erase_guestbook.py

else
  echo "Sorry, I didn't understand that." 

fi

Vielen Dank, können Sie sich meine Bearbeitung kurz ansehen? Ich bin mir nicht ganz sicher, wie ich das in meiner Situation umsetzen soll.
Benutzer

Antwort aktualisiert.
Uwe

4

In Ihrem Bash-Skript $1ist das erste Argument $2das zweite Argument und so weiter.

zB wenn Sie folgendes in test.sh:

#!/bin/sh
echo You said \"$1\"

Dann erhalten Sie folgendes:

user@host:~$ test.sh hello
You said "hello"

danke für die hilfe, könntest du dir meine bearbeitung ansehen?
Benutzer

1

Sie können Eingaben von der Befehlszeile übernehmen und an Ihr Programm weitergeben, indem Sie $ 1 (für das erste Wort nach dem Befehl), $ 2, $ 3 usw. verwenden.

Angenommen, Sie haben dieses Bash-Skript (Dateiname: Testscript) geschrieben:

#!/bin/bash
echo $1
echo $2
echo $5

Dies ist die Ausgabe, wenn das Skript von einem Benutzer von der Konsole aus aufgerufen wird (denken Sie daran, x Berechtigungen hinzuzufügen, damit das Skript von der Shell ausgeführt werden kann und platzieren Sie das Skript in / usr / local / bin /):

user:$ testscript how are you doing today?
how
are
today?

Vielen Dank für all Ihre Hilfe, die mich in die richtige Richtung gebracht hat. Folgendes habe ich für meinen speziellen Fall getan, wenn Sie neugierig waren: Es ist vielleicht nicht der beste oder eleganteste Weg zu Bash Script, aber ich habe gerade erst angefangen !:

#!/bin/bash

if [ "$1" == "sign" ]; then
  python /usr/local/bin/guestbook.data/sign_guestbook.py

elif [ "$1" == "view" ]; then
  python /usr/local/bin/guestbook.data/view_guestbook.py

elif [ "$1" == "save" ]; then
  python /usr/local/bin/guestbook.data/save_guestbook.py

elif [ "$1" == "erase" ]; then
  python /usr/local/bin/guestbook.data/erase_guestbook.py

else
  echo -n "Hello $USER, welcome to the guestbook! Choose an option (sign|view|save|erase): "

  read option

    if [ "$option" == "sign" ]; then
      python /usr/local/bin/guestbook.data/sign_guestbook.py

    elif [ "$option" == "view" ]; then
      python /usr/local/bin/guestbook.data/view_guestbook.py

    elif [ "$option" == "save" ]; then
      python /usr/local/bin/guestbook.data/save_guestbook.py

    elif [ "$option" == "erase" ]; then
      python /usr/local/bin/guestbook.data/erase_guestbook.py

    else
      echo "Sorry, I didn't understand that." 

    fi

fi

Wenn Sie mit Bash vertraut sind, sollten Sie die if-Kette durch eine case-Anweisung ersetzen. Es ist in der Regel sauberer und lesbarer / wartbarer. Abhängig von Ihrem Codierungsstil möchten Sie möglicherweise auch select verwenden: select name [in word]; Liste zu tun; getan , was ein primitives Menü für Sie macht.
Joe

0

Soweit ich weiß, möchten Sie Befehlszeilenargumente abrufen.

Nehmen Sie das folgende Beispiel:

#! /bin/bash
echo "Welcome to mybashcript!"
echo "Selected option: $1"

$1 Stellt das erste Befehlszeilenargument dar, das an Ihr Programm übergeben wird.

Wenn wir das obige Skript aufrufen (verwenden wir den Namen, den Sie in Ihrer Frage hatten mybashscript), mit loginals Argument

$ mybashscript login

Wir erhalten die Ausgabe unten:

Welcome to mybashscript!
Selected option: login

Wenn mehrere Argumente gegeben sind, können Sie sie mit Zugang $2, $3... und so weiter. Das ist aber nur dann sinnvoll, wenn Sie eine feste Anzahl von Argumenten haben. Wenn Sie eine variable Anzahl von Argumenten verwenden möchten, überprüfen Sie diesen Beitrag auf StackOverflow.


0
$ cat test.sh
#!/bin/bash
launch() {
    if [[ "$1" =~ ^(sign|view|save|erase)$ ]]; then
        echo python /usr/local/bin/guestbook.data/${1}_guestbook.py
    else
        [ -n "$1" ] && echo "Sorry, I didn't understand that."
        return 1
    fi
}
show_help() {
        echo -n "Hello, welcome to the guestbook! Choose an option (sign|view|save|erase): "
}
launch "$1" && exit
show_help
while read option; do
        if launch "$option"; then
                break
        else
                show_help
        fi
done

Testen des Codes:

$ ./test.sh
Hello, welcome to the guestbook! Choose an option (sign|view|save|erase): a
Sorry, I didn't understand that.
Hello, welcome to the guestbook! Choose an option (sign|view|save|erase): sign
python /usr/local/bin/guestbook.data/sign_guestbook.py
$ ./test.sh
Hello, welcome to the guestbook! Choose an option (sign|view|save|erase): asign
Sorry, I didn't understand that.
Hello, welcome to the guestbook! Choose an option (sign|view|save|erase): view
python /usr/local/bin/guestbook.data/view_guestbook.py
$ ./test.sh a
Sorry, I didn't understand that.
Hello, welcome to the guestbook! Choose an option (sign|view|save|erase): save
python /usr/local/bin/guestbook.data/save_guestbook.py
$ ./test.sh erase
python /usr/local/bin/guestbook.data/erase_guestbook.py

Erläuterung:

[[ "$1" =~ ^(sign|view|save|erase)$ ]];Testet die Eingabe mit regulären Ausdrücken, um präziseren Code anstelle einer if-elseLeiter zu erhalten. Das $1bezieht sich auf das erste Positionsargument, das diese Funktion erhält, nicht auf das Skript selbst. Der Test für [ -n "$1" ]soll nur das druckenSorry Anweisung , wenn Eingaben eingegeben wurden.

launch "$1" && exitversucht, über nach Eingaben zu suchen $1. Wenn dies erfolgreich ist, wird das Skript beendet.

Annahmen:

  1. Das Python-Skript wird mit einem erfolgreichen Status beendet, wie if launch "$option"; then ...es funktioniert. Wenn diese Annahme falsch ist und die Prüfung der Ausgangsbedingungen nicht verbessert wird, stecken wir in einer Schleife.
  2. Wir können verwenden $1, um das richtige Skript in der Art und Weise zu starten ${1}_guestbook.py.
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.