Linux で read コマンドを使用する方法

Linux で read コマンドを使用する方法
コマンド機能イメージの読み取り

Linux システムを操作するときに、ユーザーに入力を要求したり、ファイルから入力を読み取ったり、タイムアウトを設定したりする必要がある場合があります。 コマンドreadとそのさまざまなオプションを使用して、これらのタスクやその他の多くのタスクを実行できます。

readこの記事では、多数のコード例を使用して、コマンドとそのオプションの基本について説明します。

読み取りコマンドとは

Linux では、readコマンドを使用してユーザー入力をキャプチャしたり、標準入力 (stdin) から行を読み取ったりすることができます。このコマンドは、指定されたファイル記述子から合計バイト数を読み取り、バッファーに格納します。その後、読み取ったバイト数、ゼロ、またはエラーを返します。

たとえば、数値またはカウントが 0 の場合、ファイルの末尾を参照します。ただし、成功した場合は、読み取られたバイト数を返します。読み取りコマンドでエラーが見つかった場合は、-1 を返します。

読み取りコマンドのオプションを調べる前に、まず読み取りコマンドの構文を見てみましょう。

ここで、optionsパラメータは、読み取りコマンドの動作を変更するために使用されるさまざまなフラグを指定します。さらに、パラメータnameは、入力を格納するために使用される複数の変数の名前を指定します。名前が指定されていない場合、入力は$REPLYbash 変数に保持されます。

コマンドオプションの読み取り

Bash の read コマンドには、ユーザー入力を制御するためのオプションが多数あります。オプションによっては追加のパラメータを必要としないものもあれば、必要なものもあります。

read コマンドで使用できるいくつかのオプションを見てみましょう。

オプション 説明
-a <配列> 入力は個別の変数ではなく配列として保存されます。
-s サイレントで実行されるため、入力は端末に表示されません。
-それは readlineライブラリのサポートを有効にし、入力行の読み取りを可能にします
-i <プレフィックス> readlineを使用するときにプロンプ​​トに表示される初期入力値を提供します。
-p <プロンプト> 入力を読み込む前に指定されたプロンプトを表示する
-u <ファイル記述子> 標準入力 (stdin) ではなく指定されたファイル記述子から読み取ります。
-d <区切り文字> デフォルトの改行文字の代わりに入力行の区切り文字を指定できます。
-t <時間> 入力のタイムアウト期間を設定します。この時間内に入力が受信されない場合は、読み取りは失敗を返します。
-r 設定すると、バックスラッシュはエスケープ文字として扱われません
-n <数字> 指定された文字数だけ読み取ります

読み取りコマンドのヘルプ メニューを出力するには、次のコマンドを入力します。

読み取りコマンドを使用して入力を読み取る方法

read コマンドを使用する最も簡単な方法は、引数やオプションなしで使用することです。read コマンドを単独で実行すると、読み取る入力を指定するように求められます。入力を指定すると、コマンドは終了し、 という名前のデフォルト変数に入力を保存しますREPLY

これを例に挙げてみましょう:

読み取りコマンドを使用してユーザーからの入力をキャプチャする

入力を行った後、echo コマンドを使用してそれを表示してみましょう。

echoコマンドを使用してREPLY変数の出力を表示する

入力値を読み取っている間に、それを他の特定の変数に保存することもできます。たとえば、結果を変数に保存するには、コマンドreadに続けて変数名を入力します。

ユーザー入力値を読み取り、特定の変数に保存する

結果を表示するには、echo値を格納する変数を指定したコマンドを使用する必要があります。

echo コマンドを使用して変数キャプチャ値を表示する

複数の値の読み取り

コマンドを使用して複数の値を直接読み取る方法はありませんread。ただし、単一の入力文を複数の単語に分割し、異なる変数に格納することはできます。

次の例を考えてみましょう。

複数の値を読み取り、複数の変数に格納する

ここでは、文の最初の単語を最初の変数に格納し、2 番目の単語を 2 番目の変数に格納し、残りのすべての単語を最後に指定した変数に格納します。

次のコマンドを使用して出力を返してみましょう。

echo コマンドを使用して複数の値を表示する

ファイルからの読み取り

read は主にユーザー入力用ですが、ファイルから行を読み取るためにも使用できます。これを行うには、whileループ、echoコマンド、readコマンドの後に特定の変数名を続けて使用します。

読み取りコマンドを使用してファイルから読み取る

ここで、whileループは「samplefile.txt」の各行を読み取り、変数に記録しますline。ファイルのすべての行を読み取った後、echoコマンドは行の値を表示します。

ループで入力を読み込む

また、while ループを使用した読み取りを使用して、繰り返しシーケンスでユーザー入力をキャプチャすることもできます。これは、複数の入力を収集する場合や、特定の条件が満たされるまで継続する場合に便利です。

たとえば、複数の入力を読み取り、ターミナルに表示してみましょう。

連続ループでユーザーからの入力値を読み取る

Ctrlさらに、ループは、通常は+ を押してファイルの終わり (EOF) 信号を受信するまで継続されますD

読み取りコマンドを使用して入力を促す方法

ユーザー入力の前に表示される対話型プロンプトを作成することもできます。これは、-pread コマンドとともにオプションを使用することで実現できます。

カスタムプロンプトを表示し、入力もキャプチャしてみましょう。

ユーザーからの入力を読み取る前にプロンプ​​トを作成する

読み取り中のユーザー入力を制限する

ユーザーが入力できる内容を制御したいですか? -nread のオプションを使用して、必要な文字の長さを指定します。たとえば、ユーザー入力の最初の 4 文字をキャプチャする場合は、以下のコマンドを使用します。

指定された文字値に基づいて入力を読み取る

上記のコマンドを実行すると、9 文字しか入力できなくなります。読み取り中にユーザー入力を制限すると、区切り文字が不要になり、入力が単語に分割されることもありません。

IFS を使用して出力フィールドを分離する

内部フィールド区切り文字 (IFS) 変数を読み取りコマンドで使用すると、入力を個別のフィールドに分割する方法を決定できます。デフォルトでは、IFS は空白文字 (タブ、改行、スペース) をフィールド区切り文字として使用します。ただし、ニーズに合わせて IFS をカスタマイズできます。

たとえば、コロン (:) 値を区切り文字として指定できます。

指定された区切り値に基づいて値を読み取り、分割する

IFS 変数を使用すると、ユーザーからの複数行の入力をキャプチャし、区切り値に基づいてそれらを区切ることができます。

読み取りタイムアウトの設定

オプションを使用して、読み取りコマンドのタイムアウトを設定することもできます-t。これは、スクリプトが長時間にわたってユーザー入力に依存しないようにする場合に便利です。

-tこのオプションを使用して 10 秒のタイムアウトを設定してみましょう。

指定された時間内に入力値を読み取る

ユーザーが 10 秒以内に何も入力しない場合、スクリプトは実行を続行します。

ユーザー入力を非表示にする方法

パスワードなどの機密情報を入力するときなど、ユーザーの入力を非表示にしたい場合があります。これは、-sread コマンドのオプションを使用して実現できます。

情報を非表示にするには、readコマンドで-sオプションを使用します。

指定した変数にパスワードを保存した後、次のコマンドを使用してターミナルに表示できますecho

-e オプションと echo コマンドを使用してキャプチャしたパスワードを表示する

ここで、-eフラグはエスケープ シーケンスの解釈を許可し、\nエスケープ シーケンスは出力の前に新しい行を追加します。

まとめ

この記事を読み終えて例題に取り組めば、Linux ターミナルで read コマンドの使い方に慣れるでしょう。ただし、調べるべきコマンドは他にもいくつかあります。初心者向けの基本的なコマンドについては、引き続きお読みください。

画像クレジット: Gabriel Heinzer (Unsplash経由)。すべてのスクリーンショットはHaroon Javedによるものです。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です