Как иметь отдельные аргументы/переменные при чтении

Как иметь отдельные аргументы/переменные при чтении

Я хочу сделать CLI с помощью bash ради забавы. Я хочу иметь приглашение на чтение, как

CLI/[path]/:>

легкий

read -p "CLI$PWD/:>"

но если я хочу сделать команду типа cdтогда мне придется сделать целый интерфейс для смены каталога. Я знаю, как делать все остальные основные команды, но моя главная цель - иметь возможность переключать свой каталог одной командой.

НАПРИМЕР:

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

Мой сценарий на данный момент:

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

решение1

Прежде всего, вам нужно начать использовать кавычки. Вы наверняка заметили это

если [ $ОТВЕТ = "команда" ]
не срабатывает (и выдает  [: too many argumentsсообщение об ошибке), если вы вводите командную строку с более чем одним словом. Вам нужно изменить это на

если ["$ОТВЕТ""="команда" ]

Подход 1: Прочитайте строку и извлеките первое слово.

Я предполагаю, вы понимаете, что ваш текущий скрипт помещает всю входную строку в $REPLY. Но если пользователь вводит cd /usr/local, вам бесполезно сравнивать cd /usr/localс cd; вам нужно извлечь первое слово входной строки. Вы можете сделать это с помощью word1="${REPLY%% *}". Это пример расширения параметра, о котором вы можете прочитать вбаш(1)илиспецификация POSIX. Таким образом, вы можете изменить свой скрипт следующим образом:


    если [ "$REPLY" = "clear" ]; тогда
        прозрачный
    фи
 
    word1="${ОТВЕТИТЬ%% *}"
    если [ "$word1" = cd ]
    затем
        $ОТВЕТ
    фи

Подход 2: Прочитайте первое слово отдельно.

Редко бывает, что вам нужно прочитать целую строку; чаще (как в этом примере) вы хотите, чтобы оболочка разбила строку на слова. Вы делаете это, передавая команде readсписок переменных для чтения:


    читать -p "ECLI$PWD/:>"аргументы команды

    если ["$cmd"= "очистить" ]; тогда
        прозрачный
    фи

    если [ "$cmd" = cd ]
    затем
        cd "$args"
    фи

Подход 3: Прочитайте каждое слово отдельно.

Описанные выше подходы хороши для игрушек-подтверждений концепции. В реальном приложении вам бы хотелось, чтобы оболочка разбила входную строку на столько слов, сколько есть. Это можно сделать, считывая данные в массив, используя опцию -a :


    читать -p "ECLI$PWD/:>"-а обр
 
    если ["${arr[0]}"= "очистить" ]; тогда
        прозрачный
    фи
 
    если [ "${arr[0]}" = cd ]
    затем
        компакт-диск "${arr[1]}"
    фи

Связанный контент