【Shell】catコマンドで取得した結果をshell内で1行ずつ処理する

■実装するプログラムの概要

任意のテキストファイルに対して「cat」コマンドを実行する。
その「cat」コマンドの実行結果をshell内で読み込み、1行ずつ処理する。

■フローチャート

■プログラム仕様

インプット処理内容アウトプット
実行ファイル名をセットする。
カウンタの初期値(1)をセットする。
実行ファイル名を出力する。【メッセージ】
実行ファイル名
テキストファイル【ループ開始】テキストファイルに対して「cat」コマンドを実行し、その結果について、1行ずつループ処理を行う。
行数と「cat」コマンドで取得した情報(1行ずつ)を出力する。【メッセージ】
n行目:n行目の出力内容
※nは任意の行数を示す。
カウンタをインクリメントする。

■入力ファイルの仕様

▼sample.txt

a
b b
c c c
dd dd
ee ee e
ff ff ff

■サンプルコード

▼sample.sh

#!/bin/bash

# 実行ファイル名をセット(パスは削除)
readonly MODULE_NAME=${0##*/}

# 初期値をセット
count=1

# 実行モジュール名を出力
printf '%s\n' "実行モジュール名:${MODULE_NAME}"

# 1行ずつ読み込み、出力する。
while read -r input_data
do
    printf '%s\n' "${count}行目:${input_data}"

    ((count+=1))
done

■実行結果

$ cat sample.txt | ./sample.sh
実行モジュール名:sample.sh
1行目:a
2行目:b b
3行目:c c c
4行目:dd dd
5行目:ee ee e
6行目:ff ff ff

■補足説明

今回の実装仕様は、「cat sample.txt」を実行したのちに、パイプ(|)を使用して、「cat」コマンドの実行結果をshell(sample.sh)に渡している。

「sample.sh」の処理の中で、「read 」の標準入力にセットしている。

なお、以下に参考として、パイプ(|)の使い方と、標準入出力について示す。

▼パイプの使い方


▼標準入出力の使い方

■別解:catコマンドを使用しない方法

「cat」コマンドを使用せず、shellファイル内で完結させる場合は、while文(done)の最後に「sample.txt」を読み込ませる(以下コードの赤字部分)。

▼サンプルコード

#!/bin/bash

# 実行ファイル名をセット(パスは削除)
readonly MODULE_NAME=${0##*/}

# 初期値をセット
count=1

# 実行モジュール名を出力
printf '%s\n' "実行モジュール名:${MODULE_NAME}"

# 1行ずつ読み込み、出力する。
while read -r input_data
do
    printf '%s\n' "${count}行目:${input_data}"

    ((count+=1))
done < sample.txt

▼実行結果

$ ./sample.sh
実行モジュール名:sample.sh
1行目:a
2行目:b b
3行目:c c c
4行目:dd dd
5行目:ee ee e
6行目:ff ff ff

コメント