君は心理学者なのか?

大学時代に心理学を専攻しなぜかプログラマになった、サイコ(心理学)プログラマかろてんの雑記。

シェルで文字列を比較したときに、[: =: unary operator expected :というエラーがでる

f:id:karoten512:20180119002642j:plain

いきさつ

空行を検出するスクリプトを書いていた

古池や

蛙飛び込む
水の音

をシェルに読み込ませ、空行があったときに

「空行があるよ」というスクリプトを書いた。

※ 実際の処理を簡略化してます

#!/bin/bash
while read line
do
  if [ $line = '' ]; then
    echo '空行があるよ'
  fi  
done < line.txt

しかしうごかないんだなこれが

test.sh: line 4: [: =: unary operator expected

というエラーがでる。

どこでエラーが置きているかわからないので、

#!/bin/bash
while read line
do
  echo $line # ここで出力する
  if [ $line = '' ]; then
    echo '空行があるよ'
  fi  
done < line.txt

echo で毎行出力してみる。

古池や

test.sh: line 5: [: =: unary operator expected
蛙飛び込む
水の音

どうやら空行を読み込んだ時に起きているエラーのようだ。

調べてみた

fluidx.exblog.jp

変数に格納されている文字列比較において、 文字列の比較は文字列と行う必要があるところを、 文字列と何かわからない型の変数を比較してしまっているので、 このようなエラーが発生するらしい。

空行は「文字列かわからない型」なのか…?

ちょっとそこは釈然としない。

対処

#!/bin/bash
while read line
do
  if [ "$line" = '' ]; then
    echo '空行があるよ'
  fi  
done < line.txt

$lineを""でかこむ。文字列にキャストしている感じなのかな。

結果

空行があるよ

動いた。

シェルは独特。でもサッとかけるから便利。

環境を選ばないしねぇ。

最強のポータビリティ言語である。