ラブびあ

ビール。ときどきラブ

bashでメニュー

bashでこんな感じのメニューを簡単に作る方法です。

■■■メインメニュー■■■
 0: submenu001.sh メニュー1
 1: submenu002.sh メニュー2
 q: 終了
コマンドを選択してEnterキーで決定します>

■作り方

  • メインメニューとサブメニューは同じフォルダに作成します
  • メインメニューはサブメニューを呼び出します
  • サブメニューに記述したコマンドを適宜実行する構成です
  • メインメニューにはサブメニュー内の「#@menu:サブメニュー」が表示されます
  • メインメニューはとりあえずコピペで動きます
  • サブメニューは適宜作成してください
  • 小さいシステムならサブメニューだけで、サブメニューを直接起動でも良いかもしれません

■メインメニュー
mainmenu.sh

#!/bin/bash

setMenu()
{
	IFS=$'\n'
	menu=(`grep "^#@menu:" *.sh`)
}

getMenu()
{
	IFS=$':'
	arr=($1)

	if [[ ${#arr[@]} -ge $2 ]]; then
		echo ${arr[$2]}
	else
		echo
	fi
}

printMenu()
{
	for (( i = 0; i < ${#menu[@]}; i++ ))
	do
		shell=`getMenu "${menu[$i]}" 0`
		title=`getMenu "${menu[$i]}" 2`
		printf "%2d: %s %s \n" $i ${shell} ${title}
	done
}

executeMenu()
{
	IFS=$':'
	item=(${menu[$1]})
	./${item[0]}
}

showMenu()
{
	while true; do
		clear
		echo ■■■メインメニュー■■■
		printMenu
		echo " q: 終了"
		read -p "コマンドを選択してEnterキーで決定します> " input

		if [[ ${input} =~ "[eEqQ]" ]]; then
			exit
		fi

		if [ ${input} -ge 0 ] && [ ${input} -lt ${#menu[@]} ]; then
			executeMenu ${input}
		fi
	done
}

setMenu
showMenu
exit 0

■サブメニュー
submenu001.sh

#!/bin/bash
#@menu:メニュー1
while true; do
	clear
	cat <<EOF
==================================================
メニュー1
==================================================
 1: サブメニュー1
 2: サブメニュー2
 3: サブメニュー3
 q: 終了
==================================================
EOF
	case "$input" in
	1)
		sudo ssh -t -t {remotehost} {command1}
		;;
	2)
		sudo ssh -t -t {remotehost} {command2}
		;;
	3)
		sudo ssh -t -t {remotehost} {command3}
		;;
	q|Q|e|E)
		exit 0
		;;
	*)
		;;
	esac
	read -p "メニューを選択してください(1-3:q)>" input
done

exit 0