これは、GnuBashスクリプトに焦点を当てたシリーズの最後の記事です。最初の記事では、コマンドを使用した簡単なスクリプトを次々に作成しました。また、いくつかの変数が使用されていることも確認しました。
2番目の記事では、いくつかのbash制御構造について説明しました。 3つ目は、リダイレクト、パイプ、およびコマンド置換について説明しました。
この最後の(今のところ)1つでは、スクリプトでダイアログを使用してユーザーインターフェイスを作成する方法を示します。
インストールダイアログ
ソースはここからコンパイル用にダウンロードできます:https://invisible-island.net/dialog/。プリコンパイルされたバイナリをインストールするには、ディストリビューションに「dialog」という名前のパッケージがあり、パッケージツールでインストールできます。
一般的なオプション
次のオプションは、ダイアログで使用できるすべてのウィジェットに適用されます。ここにリストされているものはすべてではありませんが、私が最もよく使用するものです。
- -ascii-lines ボックスの周りにグラフィックスの線を引くのではなく、同じ場所に「+」と「-」を配置します。
- -title title ダイアログボックスの上部に表示されるタイトル文字列を指定します。
- -default-button string ウィジェットで事前に選択したボタンを設定します。通常、各ウィジェットの最初のボタンがデフォルトです。
- -default-item string チェックリスト、フォーム、またはメニューボックスでデフォルトの項目を設定します。
- -行なし ボックスの周りに線を引くのではなく、同じ場所にスペースを描きます。
- -影なし 各ダイアログボックスの右下に描画される影を抑制します
- -backtitle backtitle 画面上部に表示するバックタイトル文字列を指定します。
- -stdout 標準出力への直接出力。ユーザーの選択または応答を変数に保存するのに便利です
例:
dialog --backtitle 'this is backtitle' --title 'Title' --infobox "This is just an infobox with some options settled" 0 0
この出力を生成します:
その他の例:
複数の画面を持つスクリプトについての私の提案は、次のように毎回入力(またはコピー)する必要がないように、いくつかの一般的なオプションを使用してエイリアスを追加することです。
alias dialog="dialog --backtitle 'this is backtitle' --title 'Title' --stdout" dialog --infobox "This is just an infobox" 0 0
いくつかのウィジェット
インフォボックス
上からの例です。構文は次のとおりです。
--infobox text height width
ここで、textは表示するテキストであり、heightとwidthはダイアログボックスのサイズです。コマンドの出力は、コマンド置換を使用してテキストに使用できます。つまり、 --infobox "$(cat somefile.txt)" 。サイズは文字で表され、値0は自動を意味します。
yesno
「はい」と「いいえ」の回答ボタンがある典型的なクエリスタイルボックス。構文は次のとおりです。
--yesno text height width
次のようなコードを使用して、if-then-elseブロックで使用できます。
if dialog --yesno "continue?" 0 0 then echo "You choose to continue" some_command some_other_command else echo "no" fi
メニュー
単一のエントリを選択した選択肢のスクロールリスト。構文は次のとおりです。
--menu text height width menu-height tagX itemX tagY itemY
各メニューエントリは、タグ文字列とアイテム文字列で構成されています。次の例のように、case-esacブロックと組み合わせるのは素晴らしいことだと思います:
case $(dialog --menu "A menu of choices " 0 0 0 a item\ 1 b item\ 2 c item\ 3 d item\ 4) in a) echo "Item A" some commands ;; b) echo "Item B" some other commands ;; *) echo other ;; esac
入力ボックス
入力ボックスは、ユーザーが回答として文字列を入力する必要がある質問をする場合に便利です。構文は次のとおりです。
--inputbox text height width [init]
init オプションであり、デフォルトの回答を設定するために使用できます。
チェックリスト
チェックリストボックスはメニューボックスに似ています。メニューの形式で複数のエントリが表示されます。ただし、エントリを1つだけ選択する代わりに、各エントリをオンまたはオフにすることができます。構文は次のとおりです。
--checklist text height width list-height tag item status
ステータスはオンまたはオフにすることができます。選択したオプションをforループとcaseブロックで操作して、選択したオプションを評価できます。例:
for i in $(dialog --checklist "A menu of choices " 0 0 0 a item\ 1 off b item\ 2 off c item\ 3 off ) do case $i in a) echo "item 1 selected" ;; b) echo "item 2 selected" ;; c) echo "item 3 selected" ;; esac done
別の方法は、ユーザーが1つのアイテムだけを選択できるラジオリストです。
ゲージ
典型的なプログレスバー。メーターはパーセンテージを示します。新しいパーセンテージは、標準入力から読み取られます。1行に1つの整数です。構文は次のとおりです。
--gauge text height width [percent]
パーセントはオプションであり、最初に実行されたパーセントを表します。これはパイプで使用できます。例:
seq 1 100|dialog --gauge "A gauge" 0 0
カレンダー
カレンダーボックスには、月、日、年が表示されます。構文は次のとおりです。
--calendar text height width day month year
日、月、または年の値が欠落しているか負の場合、現在の日付が使用されます。
ここからの移動先
利用可能なウィジェットのいくつかを示しました(20以上あります)。ダイアログのマンページは、それらすべてのヘルプを提供します。
もちろん、テキストユーザーインターフェースを作成するために利用できるツールはダイアログだけではありません。 Xdialog、Whiptail(どちらもダイアログのマンページに記載されています)、Zenityなどの代替手段があります。それを行うには複数の方法があることを忘れないでください。
bashスクリプティングに関するこの4つの記事シリーズは、完成するまでにはほど遠いものです。私の意図は、あなたが自分で調査するのに十分好奇心をそそられるようにすることです。 bashのマンページを手元に置いてください(少なくとも私にとっては混乱することがあります)。また、例が満載のより包括的なガイドについては、Advanced BashScriptingGuideを近くに置いてください。