Bashプログラミング
 Computer >> コンピューター >  >> プログラミング >> Bashプログラミング

Bash/シェルスクリプトでユーザー入力を受け付ける方法【readコマンドの使い方を解説】

このチュートリアルでは、Bash/シェルスクリプトからユーザーにキーボード入力を促す方法を解説します。基本はreadコマンドひとつで、覚えるのも使うのもとても簡単です。実用的なサンプルコードとともに、順を追って見ていきましょう。

readコマンドとは

シェルスクリプトでユーザー入力を読み取るには、その名の通りreadコマンドを使用します。基本的な構文は以下のとおりです。

read OPTIONS VARIABLES

動作のポイントは次のとおりです。

  • readコマンドは標準入力から1行を読み込み、その内容をフィールド(単語)ごとに分割します。
    • 通常、標準入力はキーボードからの入力を受け付ける端末ですが、パイプやリダイレクトを使って入力を渡すことも可能です。
    • ユーザー側から見ると、画面が停止して入力待ちになり、何かを入力してEnterキーを押すと処理が再開されます。
  • OPTIONSには、下の表にあるオプションフラグを指定します。これによりreadコマンドの挙動を変更できます。
  • VARIABLESには、読み込んだ値を格納する変数名をスペース区切りで指定します。
    • -pオプションと組み合わせれば、ユーザーに何を入力すべきか伝えるプロンプト(案内メッセージ)を表示できます。
    • 複数のVARIABLESをスペース区切りで指定できるため、入力値にスペースなどの特殊文字が含まれる可能性がある場合は、クォートで囲むようにしましょう。
readコマンドの主なオプション 説明
-a array 読み込んだ単語を、インデックス0から順に配列変数ARRAYへ代入する
-p prompt 読み取りを行う前に、末尾に改行なしでPROMPT文字列を出力する
-r バックスラッシュによるエスケープを無効にする(生の入力をそのまま受け取る)
-s 端末からの入力を画面に表示しない(サイレントモード)
-t timeout TIMOUT秒以内に1行分の入力が完了しなければタイムアウトとして失敗を返す

その他のオプションも含めた完全なリストは、いつものようにマニュアルで確認できます。

man read

readコマンドで入力を求める具体例

ここからは、Bash/シェルスクリプトでreadコマンドを使ってユーザー入力を受け付ける実例を紹介します。

その前に…

Linuxのシェルスクリプト冒頭にある「#!」は、スクリプトを実行するインタプリタ(ここでは/bin/bash)を指定する「シバン(shebang)」と呼ばれるおまじないです。以降のサンプルでも必ず1行目に記述しています。

シンプルに入力を受け取る

まずは最も基本的な使い方です。入力された1つの値をそのまま変数に格納します。

#!/bin/bash

read word
echo You just typed $word

この例では、入力内容が変数$wordに格納され、echoコマンドで表示されます。プロンプトは表示されないため、画面が止まって入力待ちになります。ユーザーが何かを入力してEnterキーを押すと、スクリプトの続きが実行されます。

複数の値を受け取りたい場合は、変数をスペース区切りで追加するだけです。

#!/bin/bash

read word1 word2
echo You just typed $word1 followed by $word2

なお、入力された単語数が変数の数より多い場合、余った単語はすべて最後の変数にまとめて代入される点にも注意してください。

メッセージ付きで入力を促す

画面が黙って停止しているだけでは、ユーザーにとって分かりにくく不親切です。通常は「ユーザー名を入力してください」「パスワードを入力してください」のように、何を入力すべきか案内したくなりますよね。次の例ではその方法を示します。

#!/bin/bash

read -p 'Username: ' username
read -sp 'Password: ' password
echo Your username is $username, we will not display your password

上記では、-pオプションを使って各変数に対して何を入力すべきか示すプロンプトを表示しています。

さらに、パスワード用の変数には-sオプションも併用しています。これにより、入力中の文字が画面に表示されなくなります。-spのようにオプションは連結して書ける点も覚えておくと便利です。

複数の値をメッセージ付きで受け取る

-pオプションは複数の変数とも組み合わせられます。氏名を名前と姓に分けて受け取る例です。

#!/bin/bash

read -p 'Please type your first and last name: ' first last
echo Your name is $first $last

Yes/Noの確認を求める

最後に、whileループcase文を組み合わせて、ユーザーに簡単なYes/Noの質問をする方法を紹介します。yまたはYで始まる文字列は「yes」、nまたはNで始まる文字列は「no」として判定されます。

#!/bin/bash
while true; do
    read -p "Do you wish to perform this action?" yesno
    case $yesno in
        [Yy]* ) 
            echo "You answered yes"
        ;;
        [Nn]* ) 
            echo "You answered no, exiting"
            exit
        ;;
        * ) echo "Answer either yes or no!";;
    esac
done

このスクリプトは「no」と答えられるまで繰り返し質問を続けます。条件部分を書き換えれば、任意の操作の実行確認など、さまざまな場面に応用できます。


  1. Windows 10にBash(Linuxシェル)をインストールして使う方法【WSL完全ガイド】

    Windows上でLinuxシェルをセットアップして使う方法を、Windows Subsystem for Linux(WSL)を使って解説します。 このチュートリアルは、2020年以降にリリースされた最新版のWindows 10を対象としています。古いバージョンのWindows 10でのWSLの使い方や、Windows 8/7/XP向けの別の方法については扱いません。サポートが終了したソフトウェアの使用は避けるべきだからです。どうしてもWindowsを使わなければならない場合は、必ずセキュリティ更新プログラムが提供されているバージョンを使用してください。 WSLは非常に優れたツールで、まるで

  2. Windows 10にLinux Bashシェルをインストールする方法【WSL設定ガイド】

    Bashシェルとは?Windows 10でLinuxが動く仕組み Bashシェルは、長年にわたりLinuxに搭載されてきたコマンドラインユーティリティです。そして現在、MicrosoftはこのBashシェルをWindows 10に直接組み込みました。これは仮想マシンでも、コンテナでも、Windows向けにコンパイルされたソフトウェアでもありません。実態は、Linuxソフトウェアを実行するための「Windows Subsystem for Linux(WSL)」というサブシステムであり、AndroidアプリをWindows上で動かすために開発されていた(後に中止された)Project Asto