こんにちは。
さくさくTECHブロガーの「さく」です。
よくシェルを使ったバッチなどの一括処理を実行したりしますが、シェルで簡単なCUIを作成することもできます。
今回は、実際にサンプルシェルプログラムを作成してみます。
■標準入力を受け取る”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