Skip to content

シェル変数をクオートしない場合は単語分割とパターン展開される

シェルの変数は基本的にダブルクオートして使うほうがいい。ダブルクオートしない場合には以下2つの機能が有効になる。

  • IFS による単語分割
  • ファイル名のパターン展開

これは、変数を評価するときに、複数の単語として分割されるということ。

Terminal window
files='a.txt b.txt'
for i in $files
do
echo $i
done

ただし、files にスペースを含むファイルが必要になると使えなくなるので、bash なら配列を使うほうがいいだろう。

Terminal window
files=(a.txt b.txt 'mix env')
for i in "${files[@]}"
do
echo $i
done

変数の値に *? などファイルグロブが含まれていたら展開される。

Terminal window
pattern='*.txt'
echo $pattern

これも現代なら配列にするほうがいいと思う。マッチしたファイル名にスペースが含まれていてもスペースをファイル名の一部として扱える。

Terminal window
pattern='*.txt'
shopt -s nullglob
files=($pattern) # スペースが含まれていてもいい
for i in "${files[@]}"
do
echo $i
done