
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 cd
entonces 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 arguments
mensaje 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/local
compararlo 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 read
comando 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 ︙