Cómo tener argumentos/variables separados en lectura

Cómo tener argumentos/variables separados en lectura

Quiero crear una CLI usando bash por diversión. Quiero tener un mensaje de lectura como

CLI/[path]/:>

fácil

read -p "CLI$PWD/:>"

pero si quiero hacer un comando como cdentonces tendré que crear una interfaz completa para cambiar el directorio. Sé cómo ejecutar todos los demás comandos básicos, pero mi objetivo principal es poder cambiar mi directorio con un solo comando.

P.EJ:

CLI/[path]/:>cd [another path]
CLI/[another path]/:>

Mi guión hasta ahora:

#!/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

Respuesta1

En primer lugar, debes empezar a utilizar comillas. Seguro que lo has notado

si [ $RESPONDER = "dominio" ]
falla (y muestra un  [: too many argumentsmensaje de error) si escribe una línea de comando con más de una palabra. Necesitas cambiar eso a

si ["$RESPONDER"= "dominio" ]

Método 1: leer la línea y extraer la primera palabra

Supongo que comprende que su secuencia de comandos actual incluye una línea de entrada completa $REPLY. Pero, si el usuario escribe cd /usr/local, no le sirve de nada cd /usr/localcompararlo cd; debe extraer la primera palabra de la línea de entrada. Puedes hacer esto con word1="${REPLY%% *}". Este es un ejemplo de expansión de parámetros, sobre el cual puede leer enfiesta(1)ola especificación POSIX. Entonces podrías modificar tu script de la siguiente manera:


    si [ "$REPLY" = "borrar" ]; entonces
        claro
    fi
 
    palabra1="${RESPUESTA%% *}"
    si [ "$palabra1" = cd ]
    entonces
        $RESPONDER
    fi

Método 2: lea la primera palabra por separado

Es raro que quieras leer una línea completa; más a menudo (como en este ejemplo) desea que el shell divida la línea en palabras. Para ello, proporcione al readcomando una lista de variables para leer:


    leer -p "ECLI$PWD/:>"argumentos cmd

    si ["$cmd"= "claro" ]; entonces
        claro
    fi

    si [ "$cmd" = CD ]
    entonces
        cd "$argumentos"
    fi

Método 3: lea cada palabra por separado

Los enfoques anteriores están bien para los juguetes de prueba de concepto. En una aplicación real, querrá que el shell divida la línea de entrada en la cantidad de palabras que haya. Esto se hace leyendo en una matriz, usando la -a opción:


    leer -p "ECLI$PWD/:>"-una llegada
 
    si ["${arr[0]}"= "claro" ]; entonces
        claro
    fi
 
    si [ "${arr[0]}" = cd ]
    entonces
        cd "${arr[1]}"
    fi

información relacionada