我想使用 bash 制作一个 CLI 来好玩。我想要一个阅读提示,例如
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
首先,您必须开始使用引号。你肯定已经注意到了
如果 [ $REPLY = "命令”]
[: too many arguments
如果您键入包含多个单词的命令行,则会失败(并给出 错误消息)。你需要将其更改为
如果 [”$回复”=“命令”]
方法 1:读取该行并提取第一个单词
我想您了解当前的脚本将整个输入行放入$REPLY
.但是,如果用户键入,则进行比较对cd /usr/local
您没有好处;您需要提取输入行的第一个单词。您可以使用 来执行此操作。这是参数扩展的一个实例,您可以在cd /usr/local
cd
word1="${REPLY%% *}"
重击(1)或者POSIX 规范。所以你可以修改你的脚本如下:
︙ 如果[“$REPLY”=“清除”];然后 清除 菲 word1="${回复%% *}" 如果[“$word1”=cd] 然后 $回复 菲 ︙
方法二:单独读第一个单词
您很少想阅读整行;更常见的是(如本例所示),您希望 shell 将行分成单词。您可以通过向read
命令提供要读取的变量列表来完成此操作:
︙ 读取-p“ECLI$PWD/:>”命令参数 ︙ 如果 [“$cmd”=“清除”];然后 清除 菲 如果[“$cmd”=cd] 然后 cd“$args” 菲 ︙
方法3:单独阅读每个单词
上述方法适用于概念验证玩具。在实际的应用程序中,您可能希望 shell 将输入行分成任意多个单词。您可以通过使用以下选项读入数组来做到这一点-a
:
︙ 读取-p“ECLI$PWD/:>”-a arr ︙ 如果 [“${arr[0]}”=“清除”];然后 清除 菲 if [ "${arr[0]}" = cd ] 然后 cd "${arr[1]}" 菲 ︙