Bashスクリプト - 配列データに基づいてオートコンプリートユーザーを入力する

Bashスクリプト - 配列データに基づいてオートコンプリートユーザーを入力する

Bashスクリプトからいくつかのユーザー入力を読み込んでいますread。これで、キーストロークで入力を自動補完する機能を提供したいと思いますTab

簡単な例:ユーザーが有限フィールドに名前を入力する必要があるとします。スクリプトには、オートコンプリート提案に含める必要があるすべての有効な名前を含む配列があります。

プログラム可能な完成機能でいくつか試しましたが、スクリプトを移植できるようにしたいと思います。つまり、すべてが可能でなければなりません。存在するこのスクリプト。同様のものはmysqlです。入力しSELECT * FROMてクリックするTabと、データベースで使用可能なすべてのテーブル(実際にはすべての列)が表示されます。

Mac OS Xで動作する必要があります。

答え1

使用巻き戻す、readlineラッパー。

~からman rlwrap

rlwrap は、指定されたコマンドを実行してユーザー入力を傍受し、readline の行編集、継続的な記録、完了機能を提供します。

そしてDebianrlwrapパッケージの説明は次のとおりです。

このパッケージは、GNU readlineライブラリを使用して他のコマンドのキーボード入力を編集するための小さなユーティリティを提供します。入力履歴は、各コマンドごとに個別にコール全体に記憶されます。 bashのように、レコードの完了と検索は、完了した単語のリストをコマンドラインに割り当てることができます。

非常に簡単なスクリプト例:

#! /bin/bash

ynm=(Yes No Maybe)

reply=$(rlwrap -S 'Do you want to continue? ' -H ~/.jakob.history
        -e '' -i -f <(echo "${ynm[@]}") -o cat)

echo "reply='$reply'"

これは標準入力を得るために rlwrapワンタイムモードで実行されますが、1行の入力のみを許可します。はい、選択肢をお勧めします。cat-o catrlwrapread

コマンドライン履歴はbash配列に保存され、~/.jakob.history完了はbash配列に保存されます$ynm

rlwrapオプションの引数としてファイルが必要です-f。幸い、プロセス置換を使用して<(echo "${ynm[@]}")ファイルの代わりに配列を提供できます。

-i完了時に大文字と小文字を区別しないように設定します。

正常に完了したら、スペースの-e ''追加を停止しますrlwrap(たとえば、末尾のスペースではなく含まれる$replyように)。'Maybe''Maybe '

入力行の前にデフォルト値を追加するには、上記のサンプルスクリプトに追加されたコマンドなどの-Pオプションを使用できます。ユーザーは単に承認、バックスペース、または-をクリックしてデフォルトを削除できます。 (これはemacsモードでは正常です。)--pre-given-P YesrlwrapEnterCtrlUreadline

man rlwrap詳細と追加オプションを確認してください。たとえば、-cファイル名の補完を有効または有効にできます--complete-filenames

ソースコードをダウンロードしてコンパイルする前に、配布用にパッケージ化されてrlwrapいることを確認してください(少なくともDebianの場合、少なくともUbuntu / Mint / etcの場合)。

関連情報