読み取り時に別々の引数/変数を使用する方法

読み取り時に別々の引数/変数を使用する方法

私は楽しみのためにbashを使ってCLIを作りたいと思っています。次のような読み取りプロンプトが欲しいです。

CLI/[path]/:>

簡単

read -p "CLI$PWD/:>"

しかし、次のようなコマンドを実行したい場合、cdディレクトリを変更するためのインターフェイス全体を作成する必要があります。他の基本的なコマンドの実行方法はすべて知っていますが、私の主な目標は、1 つのコマンドでディレクトリを切り替えることができるようにすることです。

例えば:

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仕様したがって、スクリプトを次のように変更できます。


    if [ "$REPLY" = "clear" ]; then
        クリア
    フィ
 
    word1="${返信%% *}"
    [ "$word1" = cd ]の場合
    それから
        $返信
    フィ

アプローチ2: 最初の単語を別々に読む

行全体を読み取りたいことはまれです。多くの場合 (この例のように)、シェルで行を単語に分割する必要があります。これを行うには、コマンドreadに読み取り対象の変数のリストを指定します。


    -p "ECLI$PWD/:>" を読み取りますコマンド引数

    もし ["$cmd"= "クリア" ]; その後
        クリア
    フィ

    [ "$cmd" = cd ]の場合
    それから
        cd "$args"
    フィ

アプローチ3: 各単語を別々に読む

上記のアプローチは概念実証のおもちゃには適しています。実際のアプリケーションでは、シェルが入力行を単語の数に応じて分割することが必要になります。これは、オプションを使用して配列に読み込むことで実現できます-a 。


    -p "ECLI$PWD/:>" を読み取ります-a アール
 
    もし ["${arr[0]}"= "クリア" ]; その後
        クリア
    フィ
 
    [ "${arr[0]}" = cd ]の場合
    それから
        cd "${arr[1]}"
    フィ

関連情報