
我想使用 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]}" 菲 ︙