本文へスキップ
BecomeCoder

シェルスクリプトコース · 第3章 引数と入出力 · レッスン13

read ― 入力を受け取る

ブラウザで完結

導入

「削除しますか? (y/n)」のように、スクリプトが人に問いかけることがあります。また、ファイルを1行ずつ読んで処理するのもよくある仕事です。どちらも read という1つのコマンドで書けます。

説明

read 変数名 は、入力から1行読み取って変数に入れます。

#!/bin/bash

echo "名前を入力してください:"
read name

echo "こんにちは、$name さん"

このスクリプトに値を渡すには、パイプで流し込みます。

echo 太郎 | sh script.sh

本物の端末では、実行すると入力待ちになってキーボードから打ち込めます。このシミュレータでは待ち受けができないので、パイプで渡す形で体験します(本物でも、この書き方はそのまま使えます)。

read が本領を発揮するのは、ファイルを1行ずつ処理するときです。

while read line; do
  echo "サーバー: $line"
done < servers.txt

done < ファイル で「このループへの入力はこのファイル」と指定しています。1行読むたびに line へ入り、読む行がなくなるとループが終わります。この形は第5章で詳しく扱いますが、read の主役はむしろこちらだと知っておいてください。

flowchart TD
    A["入力(パイプ・キーボード・ファイル)"] --> B["read 変数"]
    B --> C{"読む行はあった?"}
    C -->|"あり"| D["変数に入れて次の処理へ"]
    C -->|"なし"| E["終了ステータス 1(ループが止まる)"]

実務では read -r line-r を付けるのが定石です。\ を特別扱いせず、読んだままの文字列を入れてくれます。

やってみよう

下の端末で echo 太郎 | sh script.sh と実行し、こんにちは、太郎 さん と出ることを確かめましょう。名前を変えて何度か試してください。次に read name の下に echo "文字数: ${#name}" を足すと、受け取った値を加工できることが分かります。

演習

echo 花子 | sh script.sh を実行して、こんにちは、花子 さん と表示させてください。

ヒント1を見る

下の端末で、パイプを使ってスクリプトに文字列を流し込みます。

ヒント2を見る

echo 花子 | sh script.sh

実際に動かしてみよう

本文のサンプルや演習のコードは、コードブロック右上の「コピー」ボタンでコピーして、下のエディタに貼り付ければそのまま実行できます。

シェルスクリプト(シミュレート)

スクリプトを書くエディタと、それを動かす仮想シェルを読み込みます(本物のbashではなく、動きを再現した学習用の環境です)。
スクロールして表示された時点でも自動で読み込まれます。