読者です 読者をやめる 読者になる 読者になる

やたらとIFS変数変えるとマズい件

タブ区切りでスペース含むカラムがあるファイルを処理したくて、

IFS=$'\t'
while read ・・・
do
  ・・・
done < filename

とかやってたら、

cmd="command --opt"
$cmd ${params}

とかした時に、cmd内のスペースも丸ごと一つの文字列と扱われてしまい、「"command --opt"なんてコマンドはねー」と怒られてしまった。

こういう場合はこうすればよい。

while IFS=$'\t' read ・・・
do
  ・・・
done < filename

read はコマンドなので、env コマンドを使って read を実行する際に一時的に環境変数を変えることができる。(bash では "env" を省略できる。)