シェルで文字列を比較したときに、[: =: unary operator expected :というエラーがでる
いきさつ
空行を検出するスクリプトを書いていた
古池や 蛙飛び込む 水の音
をシェルに読み込ませ、空行があったときに
「空行があるよ」というスクリプトを書いた。
※ 実際の処理を簡略化してます
#!/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 蛙飛び込む 水の音
どうやら空行を読み込んだ時に起きているエラーのようだ。
調べてみた
変数に格納されている文字列比較において、 文字列の比較は文字列と行う必要があるところを、 文字列と何かわからない型の変数を比較してしまっているので、 このようなエラーが発生するらしい。
空行は「文字列かわからない型」なのか…?
ちょっとそこは釈然としない。
対処
#!/bin/bash while read line do if [ "$line" = '' ]; then echo '空行があるよ' fi done < line.txt
$lineを""でかこむ。文字列にキャストしている感じなのかな。
結果
空行があるよ
動いた。
シェルは独特。でもサッとかけるから便利。
環境を選ばないしねぇ。
最強のポータビリティ言語である。