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
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
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
リンク
コメント