
Я хочу сделать 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]}" фи ︙