Linuxシェルスクリプト readコマンド完全ガイド - ユーザー入力からファイルを行ごとに読み込む実践テクニックまで

概要

Linux Bashシェルスクリプト作成時において、対話的なユーザー入力処理やテキストデータのパースに不可欠なreadコマンドの主要な活用法を解説します。基本的な入力処理からパスワードのマスキング(-s)、タイムアウト(-t)、区切り文字による分割(IFS)、そして実務で最も頻繁に使用されるwhileループを用いたファイルを行単位で処理する方法まで、網羅的に習得できます。

1. readコマンドの基本、プロンプト(-p)、およびデフォルト値の設定

readコマンドの実習用ディレクトリを作成して移動するために、mkdir -p ~/read-demo && cd ~/read-demoコマンドを実行します。

mkdir -p ~/read-demo && cd ~/read-demo

readコマンドは標準入力から1行を読み込んで変数に格納します。-pオプションでユーザー向けの案内プロンプトを表示でき、${変数名:-デフォルト値}構文を活用して値が空の場合にデフォルト値を代入することができます。
実行結果では、readコマンドに直接入力が渡されなかったため、username変数が空のままとなり、${username:-guest}構文に従ってデフォルト値のguestが出力されました。
⚙️ [主なオプション]

-p : 入力を受け付ける前に画面へ表示する案内プロンプト文字列を指定します。
-s : パスワードなどの機密情報を入力する際、入力された文字を画面に表示しない非表示モードを有効にします。
-t : 入力待機制限時間(秒)を設定し、指定した時間が経過すると入力を終了します。
-n : 指定した文字数のみ入力を受け付け、Enterキーを押さなくても即座に入力を終了します。
-r : バックスラッシュ(\)をエスケープ文字として解釈せず、元の文字のまま読み込みます。
-a : 入力された単語を空白区切りで分割し、配列変数へ順に格納します。
-d : 改行文字の代わりに入力の終了を判定する区切り文字(delimiter)を直接指定します。

bash -c ‘read -p “사용자 이름을 입력하세요: " username; echo “입력된 사용자: ${username:-guest}” «< “tester”’

2. パスワードのマスキング(-s)および入力制限時間(-t)の処理

実習を継続するために、先ほど作成した~/read-demoディレクトリへcd ~/read-demoコマンドを実行して移動します。

cd ~/read-demo

-sオプションで入力画面をマスキングし、-t 5オプションで5秒の制限時間を設けた状態で入力を受け付けます。
パスワードが制限時間内に正常に渡され、終了ステータスコード($?)が0として出力されました。

bash -c ‘read -t 5 -sp “비밀번호를 입력하세요 (5초 제한): " userpass; echo; echo “입력 완료 여부: $?” «< “secret1234”’

3. 区切り文字(IFS)と-aオプションを活用した複数変数および配列への分割

実習を継続するために、先ほど作成した~/read-demoディレクトリへcd ~/read-demoコマンドを実行して移動します。

cd ~/read-demo

内部フィールド区切り文字(IFS)にカンマ(,)を指定した上で、Here-String(<<<)で渡されたCSV形式の文字列をreadコマンドで読み込み、col1、col2、col3変数へそれぞれ分割して格納します。
実行結果として、文字列に含まれるサーバー名、IPアドレス、サービス名が指定した区切り文字に従って各変数へ正常に分割されて出力されました。

bash -c ‘IFS=”,” read -r col1 col2 col3 «< “server01,192.168.1.10,nginx”; echo “서버: $col1 | IP: $col2 | 서비스: $col3”’

区切り文字(IFS)にコロン(:)を設定し、-aオプションを併用して/etc/passwd形式の文字列をuser_info配列変数に分割格納します。
配列の0番目のインデックスであるアカウント名(root)と、6番目のインデックスであるログインシェルパス(/bin/bash)が正常に抽出されて出力されました。

bash -c ‘IFS=":" read -ra user_info «< “root:x:0:0:root:/root:/bin/bash”; echo “계정명: ${user_info[0]}, 셸: ${user_info[6]}”’

4. 実務の要点: whileループとread -rを用いた大容量ファイルの行単位処理

実習を継続するために、先ほど作成した~/read-demoディレクトリへcd ~/read-demoコマンドを実行して移動します。

cd ~/read-demo

ファイルを行単位で処理する実習を行うため、サーバー名と稼働ステータスがカンマ区切りで記述されたサンプルCSVファイルservers.csvを作成します。

echo -e “server-web,running\nserver-db,stopped\nserver-cache,running” > servers.csv

whileループとread -rコマンドを組み合わせ、内部フィールド区切り文字(IFS)にカンマ(,)を指定することで、servers.csvファイルの各行を1行ずつ安全に読み込みます。
実行結果として、ファイルに記録された各サーバーの名前とステータス情報がnameおよびstatus変数に正常に分割代入され、指定したフォーマットに従って出力されました。

while IFS="," read -r name status; do echo “[상태 점검] $name 서버는 현재 $status 상태입니다.”; done < servers.csv

ここまで、Linuxシェルスクリプトで活用できるreadコマンドの基本的な使い方から、実務で頻出するファイルを行単位で読み込む手法までを順に見てきました。
今回解説した多彩なオプションや使用例を参考に、用途に応じた対話型の自動化スクリプトをぜひ作成してみてください。