導入
「削除しますか? (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