如何在读取中使用单独的参数/变量

如何在读取中使用单独的参数/变量

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

相关内容