らばーいもっきんぐ

プログラミング等々についての覚え書き

【シェル】bashで改行区切りの複数行を標準入力する方法

はじめに

bashスクリプトを書く際に、改行区切りの複数行をキーボードから入力し、配列として扱う方法を調べたのでメモ。

やりたい事

2021-01-01 10:00:00  
2021-01-02 10:00:00  
2021-01-03 10:00:00  

のように、スペースを含む日時を複数行入力した際に、改行区切りで繰り返し処理を実行したい。

やり方

#!/bin/bash
IFS=$'\n'
input=$(</dev/stdin)

for v in ${input[@]}
do
  echo $v
done

解説

IFSとは

IFS(Internal Field Separator)は文字の区切りを設定するための環境変数bashではデフォルトで「スペース」「タブ」「改行」が設定されている。
今回の場合は入力文字列にスペースが含まれているため、スペースで区切られてしまうのを防ぐためにIFS=$'\n'を指定することで改行区切りに設定している。

/dev/stdinとは

/dev/stdinは標準入力(通常ではキーボード)を表しており、input=$(</dev/stdin)とする事でキーボードから入力された値を変数inputに代入する。