シェルスクリプト実行中にキー入力待ちにして入力内容を処理【Linux】

シェルスクリプト

シェルスクリプト実行中にキー入力待ちにしてインタラクティブに実装

みなさん、シェルスクリプト実行時にこんな要望はありませんか?

  • シェルスクリプトを実行時にキー入力させたい!
  • その場でインタラクティブ(対話形式)にスクリプト実行させたい!
  • 入力の値を変数に格納して処理を分岐させたい!

このページではUnix(Linux)系のOSのシェルスクリプト上で、これらを実現しインタラクティブ(対話形式)に実装する方法を解説します。

あこがれのパッケージのインストールやSSL証明書の作成時などでよくみる対話形式のシェルスクリプトを実装できます。

(RedHat/CentOS/Debian/Ubuntu/他)いろんなUnix(Linux)系OSで実行可能です。

readの基本的な使い方

キー入力待ちにするにはreadコマンドを使います。

readコマンドはキーボードからの入力をシェルの変数に代入することができます。

read オプション 変数名
オプション 説明
-a 変数名 配列変数に格納
-p 文字列 キー入力位置の前に表示する文字列
-r \(バックスラッシュ)を文字として処理
-s 入力中の文字を非表示
-t 秒数 タイムアウト時間を設定

キー入力した結果を変数に格納

yかnをキーボード入力させて変数に格納する、一番シンプルな例です。

#!/bin/sh

read -p "シェルは好きですか?(yes/no): " y_or_n

echo "確認: ${y_or_n}"
【実行結果】

$ sh key-input.sh
シェルは好きですか?(yes/no): yes
確認: yes

複数のキー入力を一度に受け付け変数に格納

格納できる変数は1つではなく複数できます。スペース区切りで変数を並べるだけです。

#!/bin/sh

#シェルスクリプト実行中にキー入力を受け付けるインタラクティブな実装を実現する
#readオプション
# -p プロンプトを表示する
# -t タイムアウトを設定する

read -p "好きな食べ物を3つ教えてください: " food1 food2 food3

echo $food1
echo $food2
echo $food3
【実行結果】

$ sh key-input.sh 
好きな食べ物を3つ教えてください: りんご きのこ ヨーグルト
りんご
きのこ
ヨーグルト

区切り文字をスペース以外に変える

IFSという環境変数を指定することで変更できます。
デフォルトではスペースですが以下の例ではカンマに変更しています。

#!/bin/sh
#区切り文字を変える

IFS="," #カンマに変更
read -p "好きな食べ物を3つ教えてください: " food1 food2 food3

echo $food1
echo $food2
echo $food3
【実行結果】

$ sh key-input.sh
好きな食べ物を3つ教えてください: りんこ,きのこ,ヨーグルト
りんこ
きのこ
ヨーグルト

正しいキーボード入力があるまで再入力ループ

正しいキー入力があるまで、なんども再入力を促してくるタイプの例です。
whileを使います。

#!/bin/sh

#正しい入力がされるまで、ループして再入力をうながす

while : #無限ループ表現
do
  read -p "データを全て消去します。本当によろしいですか?(y/n): " yn

  if [ "$yn" = "y" ]; then
    echo "それでは消去を開始します!"
    break
  elif [ "$yn" = "n" ]; then
    echo "それでは消去はキャンセルします・・・"
    break
  else
    echo "入力が不正です。キーボードでyかnを入力してください。"
    echo ""
  fi
done
【実行結果】

$ sh key-input.sh 
データを全て消去します。本当によろしいですか?(y/n): yes
入力が不正です。キーボードでyかnを入力してください。

データを全て消去します。本当によろしいですか?(y/n): no
入力が不正です。キーボードでyかnを入力してください。

データを全て消去します。本当によろしいですか?(y/n): 
入力が不正です。キーボードでyかnを入力してください。

データを全て消去します。本当によろしいですか?(y/n): y
それでは消去を開始します!

これでいつもパッケージインストーラーとかでよく見るキー入力による対話形式のスクリプトができました!

以上、おつかれさまでした!

コメント

タイトルとURLをコピーしました