Como ter argumentos/variáveis ​​separados na leitura

Como ter argumentos/variáveis ​​separados na leitura

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 cdesse 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 argumentsmensagem 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/localcom 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 readcomando 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

informação relacionada