GNU/Linux >> Linux の 問題 >  >> Linux

1行で複数選択するのではなく、1行で各メニューを選択する方法は?

テーマのツールスクリプトを作成する場合、6つのオプションがあります。
1)テーマの更新を確認する
2)テーマを再インストールする
3)フォントをインストールする
4)壁紙をインストールする
5 )ツールの更新を確認します
6)終了します

これがコードです

clear
echo "==========================="
echo "Tool for theme"
echo "==========================="

function check_update {
echo "checking theme update"
}

function reinstall_theme {
echo "Reinstalling"
echo "==========================="
}

function font {
echo "Installing font"
}

function wall {
echo "Installing wallpaper"
}

function check_update_tool {
echo "Checking tool update"
}

all_done=0
while (( !all_done )); do
options=("Check theme update" "Reinstall theme" "Install font" "Install wallpaper" "Check tool update" "Quit")

echo "Choose an option: "
select opt in "${options[@]}"; do
case $REPLY in
1) check_update; break ;;
2) reinstall_theme; break ;;
3) font; break ;;
4) wall; break ;;
5) check_update_tool; break ;;
6) all_done=1; break ;;
*) echo "Invalid option" ;;
esac
done
done

echo "Exiting"
sleep 2

しかし、実行すると、メニューの選択が混乱します

==================
Tool for theme
==================
Choose an option:
1) Check theme update 2) Reinstall theme  3) Install font
4) Install Wallpaper     5) Check tool update      6) Quit

しかし、私が欲しいのは

===============
Tool for theme
===============
Choose an option:
1) Check theme update
2) Reinstall theme
3) Install font
4) Install wallpaper
5) Check tool update
6) Quit

では、どうすればメニューを修正できますか?

承認された回答:

COLUMNSを設定できます 表示の幅を制限する変数。たとえば、12に設定すると、例が1つの列にフォーマットされます。

COLUMNS=12
select opt in "${options[@]}"; do
case $REPLY in
1) check_update; break ;;
2) reinstall_theme; break ;;
3) font; break ;;
4) wall; break ;;
5) check_update_tool; break ;;
6) all_done=1; break ;;
*) echo "Invalid option" ;;
esac

生成する

===========================
Tool for theme
===========================
Choose an option: 
1) Check theme update
2) Reinstall theme
3) Install font
4) Install wallpaper
5) Check tool update
6) Quit
#? 

bashマニュアルでは、COLUMNSについて説明しています:

selectによって使用されます 選択リストを印刷するときに端子幅を決定するコマンド。 checkwinsizeの場合は自動的に設定されます オプションが有効になっている(The Shopt Builtinを参照)か、 SIGWINCHを受信するとインタラクティブシェルで有効になります

マニュアルページで機能を確認するだけでなく、ソースコードを読んで完全なストーリーを入手することも役立ちます。この変数は、select_queryで使用されます 関数、コメント付き

/* Print the elements of LIST, one per line, preceded by an index from 1 to
   LIST_LEN.  Then display PROMPT and wait for the user to enter a number.
   If the number is between 1 and LIST_LEN, return that selection.  If EOF
   is read, return a null string.  If a blank line is entered, or an invalid
   number is entered, the loop is executed again. */

その後、select_queryで 関数

  t = get_string_value ("COLUMNS");
  COLS =  (t && *t) ? atoi (t) : 80;

合理的なを与える場合 値、atoi 妥当な結果が得られます(この場合はゼロでも少ないため、もっともらしい結果が得られます。 80列を超え、atoiによって返されます COLUMNSを設定した場合 数値以外の値に)。値がない場合(例:COLUMNS="" )、bash 80列を使用します。

関連:Bash:Shift +矢印キーでA、B、C、Dになりますか?

さらに読む:

  • atoi –文字列を整数に変換します

    atoi(str)の呼び出しは、次と同等です。
    (int) strtol(str, (char **)NULL, 10)

  • strtol、strtoll –文字列を長整数に変換します

    変換を実行できなかった場合は、0が返されます


Linux
  1. Bash で、ファイルの各行の後に文字列を追加するにはどうすればよいですか?

  2. Linux シェルでは、複数行の文字列の各行をどのように処理できますか?

  3. Linuxコマンドライン:du ---各ディレクトリの合計のみを表示する方法

  1. Vimの各行の先頭にテキストを挿入する方法

  2. UNIXデータファイルの各行の最初のn文字を取得する方法

  3. ディレクトリ内に一度に複数のディレクトリを作成するにはどうすればよいですか?

  1. ファイルに複数の行を追加するにはどうすればよいですか?

  2. 長い行に4文字ごとにスペースを挿入するにはどうすればよいですか?

  3. Bashシェルスクリプトで改行をエコーする方法