Bash
如何在讀取中有單獨的參數/變數
我想用 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
首先,你必須開始使用引號。你肯定注意到了
如果 [ $REPLY = "*命令*" ]
[: too many arguments
如果您鍵入的命令行包含多個單詞,則會失敗(並給出 錯誤消息)。您需要將其更改為如果 [ **"** $REPLY **"** = "*命令*" ]
方法 1:讀取該行並提取第一個單詞
我假設您了解您目前的腳本將整個輸入行放入
$REPLY
. 但是,如果使用者鍵入cd /usr/local
,則無法與之cd /usr/local
比較cd
;您需要提取輸入行的第一個單詞。您可以使用word1="${REPLY%% *}"
. 這是參數擴展的一個實例,您可以在bash(1)或POSIX 規範中閱讀。所以你可以修改你的腳本如下:︙ 如果 [ "$REPLY" = "clear" ]; 然後 清除 是 **word1="${REPLY%% *}" 如果 [ "$word1" = cd ] 然後 $回复 ︙** _
方法二:分別讀第一個單詞
你很少想讀一整行。更多時候(如本例中),您希望 shell 將行拆分為單詞。您可以通過為
read
命令提供要讀入的變數列表來做到這一點:︙ 讀取 -p "ECLI$PWD/:>" **cmd 參數** ︙ if [ **"$cmd"** = "clear" ]; 然後 清除 是 **如果 [ "$cmd" = cd ] 然後 cd "$args" ︙** _
方法3:分別閱讀每個單詞
上述方法適用於概念驗證玩具。在實際應用程序中,您可能希望 shell 將輸入行分解為有多少單詞。
-a
您可以通過使用以下選項讀取數組來做到這一點:︙ 讀取 -p "ECLI$PWD/:>" **-a arr** ︙ 如果 [ **"${arr[0]}"** = "clear" ]; 然後 清除 是 **如果 [ "${arr[0]}" = cd ] 然後 cd "${arr[1]}" ︙** _