Bash

如何在讀取中有單獨的參數/變數

  • November 29, 2019

我想用 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]}"
︙** 
_

引用自:https://unix.stackexchange.com/questions/554534