
Quero fazer uma CLI usando o bash para me divertir. Eu quero ter um prompt de leitura como
CLI/[path]/:>
fácil
read -p "CLI$PWD/:>"
mas se eu quiser fazer um comando como cd
esse terei que fazer uma interface inteira para mudar o diretório. Eu sei como executar todos os outros comandos básicos, mas meu principal objetivo é poder mudar meu diretório em um comando.
POR EXEMPLO:
CLI/[path]/:>cd [another path]
CLI/[another path]/:>
Meu roteiro até agora:
#!/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
Responder1
Primeiro de tudo, você precisa começar a usar aspas. Certamente você já percebeu isso
if [ $RESPONDER = "comando"]falha (e exibe uma
[: too many arguments
mensagem de erro) se você digitar uma linha de comando com mais de uma palavra. Você precisa mudar isso para
se ["$RESPONDER"= "comando"]
Abordagem 1: Leia a linha e extraia a primeira palavra
Presumo que você entenda que seu script atual coloca uma linha de entrada inteira no arquivo $REPLY
. Mas, se o usuário digitar cd /usr/local
, não adianta comparar cd /usr/local
com cd
; você precisa extrair a primeira palavra da linha de entrada. Você pode fazer isso com word1="${REPLY%% *}"
. Este é um exemplo de expansão de parâmetros, sobre o qual você pode ler emfestança(1)oua especificação POSIX. Então você pode modificar seu script da seguinte maneira:
︙ if [ "$REPLY" = "limpar"]; então claro fi palavra1="${RESPOSTA%% *}" if ["$palavra1"=cd] então $RESPONDER fi ︙
Abordagem 2: Leia a primeira palavra separadamente
É raro você querer ler uma linha inteira; mais frequentemente (como neste exemplo) você deseja que o shell divida a linha em palavras. Você faz isso fornecendo ao read
comando uma lista de variáveis para leitura:
︙ leia -p "ECLI$PWD/:>"argumentos cmd ︙ se ["$cmd"= "limpar"]; então claro fi se ["$cmd"=cd] então CD "$args" fi ︙
Abordagem 3: Leia cada palavra separadamente
As abordagens acima são adequadas para brinquedos de prova de conceito. Em uma aplicação real, você desejaria que o shell dividisse a linha de entrada em quantas palavras existissem. Você faz isso lendo um array, usando a -a
opção:
︙ leia -p "ECLI$PWD/:>"-um arr ︙ se ["${arr[0]}"= "limpar"]; então claro fi se [ "${arr[0]}"=cd] então cd "${arr[1]}" fi ︙