
私は楽しみのために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/local
cd
word1="${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]}" フィ ︙