テーマのツールスクリプトを作成する場合、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列を使用します。
さらに読む:
- atoi –文字列を整数に変換します
atoi(str)の呼び出しは、次と同等です。
(int) strtol(str, (char **)NULL, 10)
- strtol、strtoll –文字列を長整数に変換します
変換を実行できなかった場合は、0が返されます