矢印キーとEnterを使用してナビゲートできるインラインメニューをシェルに表示するツールを探しています。 「インライン」とは、メニューが標準出力テキストの一般的なフロー内に表示されることを意味します。いいえすべての上にポップアップダイアログがあります。
やっと見つけたその投稿私はこの問題を解決しようとしましたが、カスタムスクリプトやインラインではなく/ポップアップソリューション(またはdialog
)zenity
のみが言及されました。
私が探しているのは、apt-get
Dockerイメージに使用するか、単にインストールし、npm install -g
オプションリストを使用してスクリプトから呼び出して、ユーザーが選択したものをインポートできる強力なパッケージです。
nodeJSで私は使用しています質問者これらのメニューを提供するだけでなく、さまざまな入力も提供します。
これは例ですスクリーンショットそんなインラインメニュー。
このツールはシェルスクリプトで書く必要はありません。apt-get
使いやすさが簡単な限り、任意の言語で書かれたバイナリ/スクリプトにすることができますcurl
。選択を渡すシェルスクリプトから呼び出すことができる限り、nodeJSツールも可能です。
答え1
前に使ったアイセレクトこのために数年前。
ㅏ非常に基本例:
$ sel="$(iselect -a 'foo' 'bar')"
$ echo $sel
foo
からman iselect
:
iSelectは、フルスクリーンのCursesベースのターミナルセッションを介して機能するASCIIファイル用の対話型行選択ツールです。 Bourne-Shell、Perl、または他の種類のスクリプトバックエンドで制御されるユーザーインターフェイスのフロントエンドのラッパーとして使用するか、バルクパイプラインフィルタ(通常はgrepと最終実行コマンドの間)として使用できます。つまり、iSelectはあらゆる種類の行ベースの対話型選択用に設計されています。
入力データ
入力は、各引数がバッファラインに対応するコマンドライン(line1 line2 ...)から読み取られるか、またはバッファラインが改行に基づいて決定されるstdin(引数が指定されていない場合)から読み取ることができます。
"<b>"..."</b>"
また、HTMLの構文を使用して、選択できない行の部分文字列を太字で表示することもできます(選択可能な行は常に太字で表示されるため)。
答え2
非常に基本的な方法はbash
のselect
文を使用することです。他のものをインストールする必要はありません。取得した例は次のとおりです。
#!/bin/bash
[...]
sourceBranch=
targetBranch=
# Force one option per line
columnsBackup=${COLUMNS}
COLUMNS=40
echo "Select source and target branch:"
select branches in \
"testing -> release-candidate" \
"release-candidate -> stable-release" \
"stable-release -> stable"
do
if [ -z "${branches}" ]; then
echo "Invalid selection"
continue
fi
sourceBranch="${branches%% -> *}"
targetBranch="${branches##* -> }"
break
done
COLUMNS=${columnsBackup}
echo "Releasing from ${sourceBranch} to ${targetBranch}"
[...]
出力:
Select source and target branch:
1) testing -> release-candidate
2) release-candidate -> stable-release
3) stable-release -> stable
#? 1
Releasing from testing to release-candidate
case ... esac
ブロック単位でいくつかの処理を実行することもできますdo ... done
。
答え3
bashを使用して問題を解決する方法は次のとおりです。
#!/usr/bin/env bash
# Renders a text based list of options that can be selected by the
# user using up, down and enter keys and returns the chosen option.
#
# Arguments : list of options, maximum of 256
# "opt1" "opt2" ...
# Return value: selected index (0 for opt1, 1 for opt2 ...)
figlet -st "$COLUMNS" "Welcome $USER"
printf '\n?%s\n?%s\n?%s\n\n' "What's the name of your website simple-site" "What's the description of your website(optional):" "Please choose lincense":
# Change the value of options to whatever you want to use.
options=("MIT" "Apache-2.0" "GPL-3.0" "Others")
select_option (){
# little helpers for terminal print control and key input
ESC=$(printf '%b' "\033")
cursor_blink_on() {
printf '%s' "$ESC[?25h"
}
cursor_blink_off() {
printf '%s' "$ESC[?25l"
}
cursor_to() {
printf '%s' "$ESC[$1;${2:-1}H"
}
print_option() {
printf ' %s ' "$1"
}
print_selected() {
printf ' %s' "$ESC[7m $1 $ESC[27m"
}
get_cursor_row() {
IFS=';' read -sdR -p $'\E[6n' ROW COL; printf '%s' ${ROW#*[}
}
key_input() {
read -s -n3 key 2>/dev/null >&2
if [[ $key = $ESC[A ]]; then
echo up
fi
if [[ $key = $ESC[B ]]; then
echo down
fi
if [[ $key = "" ]]; then
echo enter
fi
}
# initially print empty new lines (scroll down if at bottom of screen)
for opt; do
printf "\n"
done
# determine current screen position for overwriting the options
local lastrow=$(get_cursor_row)
local startrow=$(($lastrow - $#))
# ensure cursor and input echoing back on upon a ctrl+c during read -s
trap "cursor_blink_on; stty echo; printf '\n'; exit" 2
cursor_blink_off
local selected=0
while true; do
# print options by overwriting the last lines
local idx=0
for opt; do
cursor_to $((startrow + idx))
if [[ $idx == $selected ]]; then
print_selected "$opt"
else
print_option "$opt"
fi
((idx++))
done
# user key control
case $(key_input) in
enter) break;;
up) ((selected--));
if (( $selected < 0 )); then selected=$(($# - 1)); fi;;
down) ((selected++));
if (( selected > $# )); then selected=0; fi;;
esac
done
# cursor position back to normal
cursor_to $lastrow
printf "\n"
cursor_blink_on
return "$selected"
}
select_option "${options[@]}"
choice=$?
index=$choice
value=${options[$choice]}
case $value in
MIT) ## User selected MIT
read -rp "Really use? $value [Y/N] " answer
[[ $answer ]] || { echo "No answer!" >&2; exit 1; }
if [[ $answer == [Yy] ]]; then
: ## User selected Y or y, what are you going to do about it?
elif [[ $answer == [Nn] ]]; then
: ## User selected N or n what are you going to do about it?
fi
printf '%s\n' "You have choosen $answer";;
Apache-2.0)
read -rp "Really use? $value [Y/N] " answer
[[ $answer ]] || { echo "No answer!" >&2; exit 1; }
if [[ $answer == [Yy] ]]; then
:
elif [[ $answer == [Nn] ]]; then
:
fi
;;
GPL-3.0)
read -rp "Really use? $value [Y/N] " answer
[[ $answer ]] || { echo "No answer!" >&2; exit 1; }
if [[ $answer == [Yy] ]]; then
:
elif [[ $answer == [Nn] ]]; then
:
fi
;;
Others)
read -rp "Really use? $value [Y/N] " answer
[[ $answer ]] || { echo "No answer!" >&2; exit 1; }
if [[ $answer == [Yy] ]]; then
:
elif [[ $answer == [Nn] ]]; then
:
fi
;;
esac
出力は次のとおりです。https://i.stack.imgur.com/RO9E5.png:
ifステートメント内では何もしません。コード/プロセスまたは答えが次のような場合は、やりたいことに置き換えてください。これ:
であれば、始めるのに十分です。ところで、どこかにモーションキャプチャコードが公開されていることを発見し、いくつかの構文を拡張/再作成しました。[Yy]
[Nn]