【bashシェル】半角スペースを含む行でループ処理を行う


この記事はプロモーションを含みます。

bashシェル

bashシェルスクリプトで、半角スペースを含む行を元に、ループ処理を行う方法を解説します。

はじめに

[ls -l]コマンドなど、半角スペースを含む行を元にループ処理をすると、半角スペースも改行として扱われてしまいます。
本記事では、半角スペースで改行せずに、1行ずつ処理する方法を説明します。

まず、普通にlsコマンドの結果を元にループする例を見てみます。

[root@STKPUB002 data]# ls -l | tail -n +2
-rw-r--r--. 1 root root 0  6月 22 21:16 file1.txt
-rw-r--r--. 1 root root 0  6月 22 21:16 file2.txt
-rw-r--r--. 1 root root 0  6月 22 21:16 file3.txt

lsコマンドの実行結果が上記のような場合、以下のように出力されてしまいます。

[root@STKPUB002 workspace]# sh test.sh
-rw-r--r--.
1
root
root
0
6月
22
21:16
file1.txt
~~~省略~~~

以下は、お試しで使用したシェルスクリプトです。

#!/bin/bash

for buf in $(ls -l /home/workspace/data/ | tail -n +2); do
	echo $buf
done

ちなみにサンプルのシェルスクリプトで使用しているコマンドのパイプの右側にある「tail -n +2」は、「ls -l」コマンド実行時に1行目に表示される「合計~」という情報を表示させないようにするための記述です。

for文の区切り文字を変更する

ここでは、for文で使用する区切り文字を改行コードに変更する方法を説明します。

bashのデフォルトの区切り文字が「スペース」「タブ」「改行」となっているため、「ls -l」コマンドなどのスペースを含む情報がうまく1行として扱うことが出来ません。
なので、区切り文字を「改行」のみにすることで、半角スペースやタブを含む場合でも、1行の情報は、1行として扱えるようにします。

区切り文字を変更するには「IFS=$’\n’」と記述します。
以下はサンプルのソースコードです。

#!/bin/bash

# 区切り文字を改行コードに設定
IFS=$'\n'

for buf in $(ls -l /home/workspace/data/); do
	count=$((${count} + 1))
	echo ${count}行目 → ${buf}
done

上記の実行結果です。

[root@STKPUB002 workspace]# sh test.sh
1行目 → 合計 0
2行目 → -rw-r--r--. 1 root root 0  6月 22 21:16 file1.txt
3行目 → -rw-r--r--. 1 root root 0  6月 22 21:16 file2.txt
4行目 → -rw-r--r--. 1 root root 0  6月 22 21:16 file3.txt

IFSを変更する場合、想定外の動作が起きないように、処理が終了したタイミングで元の設定に戻しておくことが望ましいです。
以下の記事で詳しく説明しているので参考にしてみて下さい。

while readでループ処理する

ここでは、for文ではなく、「while read」を使ってループ処理を行う方法を説明します。

「while read」の書式は以下のようになります。

実行するコマンド | while read 変数
do
	実行する処理1
	実行する処理2
done

以下はサンプルのソースコードです。

#!/bin/bash

ls -l /home/workspace/data/ | while read line
do
	count=$((${count} + 1))
	echo ${count}行目 → ${line}
done

上記の実行結果です。

[root@STKPUB002 workspace]# sh test.sh
1行目 → 合計 0
2行目 → -rw-r--r--. 1 root root 0 6月 22 21:16 file1.txt
3行目 → -rw-r--r--. 1 root root 0 6月 22 21:16 file2.txt
4行目 → -rw-r--r--. 1 root root 0 6月 22 21:16 file3.txt

コメント

タイトルとURLをコピーしました