シェルで簡単なUIを作成する方法

Linux

こんにちは。
さくさくTECHブロガーの「さく」です。


よくシェルを使ったバッチなどの一括処理を実行したりしますが、シェルで簡単なUIを作成することもできます。
今回は、実際にサンプルシェルプログラムを作成してみます。


■標準入力を受け取る”read”コマンド


標準入力を受け取るには、readコマンドを使用します。
以下の例では、-pオプションを使用して、入力文字列の前に選択肢の文字列を表示しています。


read -p "削除するフォルダを選択して下さい。[ 'A' or 'B' or 'C']." input

function化して部品化


決められた文字の入力のみを想定している場合、イレギュラーな文字を入力された場合の制御は意外と厄介です。
function化することで、シェルプログラムの煩雑化を防ぐことができます。


function select_delete() {
  read -p "削除するフォルダを選択して下さい。[ 'A' or 'B' or 'C']." input

  if [ -z $input ] ; then
    select_delete               # ←何も入力されなかった場合は再び"select_delete()"を呼び出す
  elif [ $input = 'A' ] ; then
    return 1
  elif [ $input = 'B' ] ; then
    return 2
  elif [ $input = 'C' ] ; then
    return 3
  else
    select_delete               # ←A・B・C以外が入力された場合は再び"select_delete()"を呼び出す
  fi
}
select_delete                   # ←通常の呼び出しパターン"select_delete()"を呼び出す

 


処理と組み合わせる

[display_update_date]


サンプルシェルプログラムを作ってみました。
削除したいフォルダが「A」「B」「C」の3つ存在するとした場合、どれを消すかを選択してもらえれば、選択したフォルダを削除するシェルプログラムになります。


このサンプルはわざわざシェル化する必要ないようなものですが、いろいろな用途で使えるテクニックかと思います。


#!/bin/bash

function select_delete() {
  read -p "削除するフォルダを選択して下さい。[ 'A' or 'B' or 'C']." input

  if [ -z $input ] ; then
    select_delete
  elif [ $input = 'A' ] ; then
    return 1
  elif [ $input = 'B' ] ; then
    return 2
  elif [ $input = 'C' ] ; then
    return 3
  else
    select_delete
  fi
}
select_delete
mode=$?

if [ ${mode} =  1 ]; then
   rm -fr A
elif [ ${mode} =  2 ]; then
   rm -fr B
elif [ ${mode} =  3 ]; then
   rm -fr C
else
   exit 0
fi