koguti ターミナル上で動作する出納帳 フリーソフト

Windowsにも Linux にも対応 10兆円規模に対応

シェルスクリプトでwhileループ内の変数が使えない時

シェルスクリプトでwhileループを使っていて、はまってしまったことがあります。
はまったといっても、喜んでする意味ではなく、困ったという意味です。
下のスクリプトは、エラーが出ます。
acelistというファイルに連番がついていてそれを循環させて並べ替える処理です。
whileループの中で使っている iとlineという変数が、ループを出ると使えなくなるんです。
原因は、whileループにパイプでファイル名を流し込んでいるところにあります。
そうすると、whileループが別のルーチンを作ってしまって上記の現象が出ます。

#############################################################
#acelistの並べ替え
#############################################################
ls -1 | grep acelist | while read line
do
if [ $i -eq 0 ]
then
cp $line wlist
wline=$line
else
cp $line $wline
wline=$line
fi
done 
cp wlist $wline
rm temp
rm wlist
echo $i"件のacelistの並べ替えが終わりました"

そこで下記のように、流し込むためのtempファイルを作って、お尻(done)から突っ込んでいます。
なんかとても下品な表現ですが、これなら上手く行きます。勉強になりました。

#!/bin/bash
#############################################################
#acelistの並べ替え
#############################################################
ls -1 | grep acelist > temp
while read line
do
if [ $i -eq 0 ]
then
cp $line wlist
wline=$line
else
cp $line $wline
wline=$line
fi
done < temp
cp wlist $wline
rm temp
rm wlist
echo $i"件のacelistの並べ替えが終わりました"

*1:i=0

*2:++i

*3:i=0

*4:++i