如何在讀取中使用單獨的參數/變量

如何在讀取中使用單獨的參數/變量

我想使用 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/localcdword1="${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]}"

相關內容