
Ich möchte zum Spaß eine CLI mit Bash erstellen. Ich möchte eine Leseaufforderung wie
CLI/[path]/:>
einfach
read -p "CLI$PWD/:>"
aber wenn ich einen Befehl wie cd
diesen ausführen möchte, muss ich eine ganze Schnittstelle zum Ändern des Verzeichnisses erstellen. Ich weiß, wie alle anderen grundlegenden Befehle ausgeführt werden, aber mein Hauptziel ist, mein Verzeichnis mit einem Befehl wechseln zu können.
Z.B:
CLI/[path]/:>cd [another path]
CLI/[another path]/:>
Mein bisheriges Skript:
#!/bin/bash
echo "Welcome to Easy Command-Line Interface! Type 'help' for help and
commands."
while true; do
read -p "ECLI$PWD/:>"
if [ $REPLY = "help" ]; then
echo "ECLI HELP:"
echo "help: Help Menu"
echo "cd: <dir> : Changes Directory"
echo "say: <text> : Prints <text>"
echo "exit: Exits ECLI"
echo "clear: Clears screen"
echo "
"
fi
if [ $REPLY = "exit" ]; then
echo "Exiting ECLI.."
sleep 1.5
clear
break
fi
if [ $REPLY = "clear" ]; then
clear
fi
done
Antwort1
Zunächst einmal müssen Sie anfangen, Anführungszeichen zu verwenden. Sicherlich haben Sie bemerkt, dass
wenn [ $REPLY = "Befehl" ]schlägt fehl (und gibt eine
[: too many arguments
Fehlermeldung aus), wenn Sie eine Befehlszeile mit mehr als einem Wort eingeben. Sie müssen das ändern in
Wenn ["$ANTWORT"= "Befehl" ]
Ansatz 1: Lesen Sie die Zeile und extrahieren Sie das erste Wort
Ich gehe davon aus, dass Sie verstehen, dass Ihr aktuelles Skript eine ganze Eingabezeile in extrahiert $REPLY
. Wenn der Benutzer jedoch eingibt cd /usr/local
, nützt es Ihnen nichts, cd /usr/local
mit zu vergleichen cd
; Sie müssen das erste Wort der Eingabezeile extrahieren. Dies können Sie mit tun word1="${REPLY%% *}"
. Dies ist ein Beispiel für die Parametererweiterung, über die Sie in lesen könnenbash(1)oderdie POSIX-SpezifikationSie könnten Ihr Skript also wie folgt ändern:
︙ wenn [ "$REPLY" = "löschen" ]; dann klar fi Wort1 = "${REPLY%% *}" wenn [ "$wort1" = cd ] Dann $ANTWORT fi ︙
Ansatz 2: Lesen Sie das erste Wort separat
Es kommt selten vor, dass Sie eine ganze Zeile lesen möchten. Häufiger (wie in diesem Beispiel) möchten Sie, dass die Shell die Zeile in Wörter aufteilt. Dies erreichen Sie, indem Sie dem read
Befehl eine Liste von Variablen übergeben, die gelesen werden sollen:
︙ lesen -p "ECLI$PWD/:>"Befehlsargumente ︙ Wenn ["$cmd"= "klar" ]; dann klar fi wenn [ "$cmd" = cd ] Dann cd "$args" fi ︙
Ansatz 3: Lesen Sie jedes Wort einzeln
Die oben genannten Ansätze sind für Proof-of-Concept-Spielzeuge gut geeignet. In einer echten Anwendung möchten Sie, dass die Shell die Eingabezeile in beliebig viele Wörter aufteilt. Dies erreichen Sie, indem Sie in ein Array einlesen und dabei die folgende -a
Option verwenden:
︙ lesen -p "ECLI$PWD/:>"-a arr ︙ Wenn ["${arr[0]}"= "klar" ]; dann klar fi wenn [ "${arr[0]}" = cd ] Dann cd "${arr[1]}" fi ︙