So haben Sie separate Argumente/Variablen beim Lesen

So haben Sie separate Argumente/Variablen beim Lesen

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 cddiesen 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 argumentsFehlermeldung 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/localmit 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 readBefehl 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

verwandte Informationen