ifステートメントが正しく機能しません。

ifステートメントが正しく機能しません。

次のファイルがあり、それをwhileループの入力として読み込んでいます。

このコマンドは以下cat status_1.txtを生成します。

SQLLOADER|FALSE
TX3|TRUE

以下は私のスクリプトです。

#!/bin/bash
set -x
cat /iris/shrikant/scripts/status_1.txt;
echo
echo
IFS="|"
while read a b
do
date;
c=TRUE
        if [ "${b}" = "${c}" ]; then
        echo $a is freezed;

        else

        echo $a is not freezed;

        fi;

done < status_1.txt;

しかし、望む結果が得られませんでした。

cat /iris/shrikant/scripts/status_1.txt
SQLLOADER|FALSE
TX3|TRUE

+ cat /iris/shrikant/scripts/status_1.txt
SQLLOADER|FALSE
TX3|TRUE
+ echo

+ echo

+ IFS='|'
+ read a b
+ date
Tue Nov  6 23:38:19 +08 2018
+ c=TRUE
+ '[' $'FALSE\r' = TRUE ']'
+ echo SQLLOADER is not freezed
SQLLOADER is not freezed
+ read a b
+ date
Tue Nov  6 23:38:19 +08 2018
+ c=TRUE
+ '[' $'TRUE\r' = TRUE ']'
+ echo TX3 is not freezed
TX3 is not freezed
+ read a b

値が一致すると、if文は一致する条件の代わりにelse文を出力します。

答え1

このファイルはstatus_1.txtDOSテキストファイルです。これはトレース出力の値の末尾にある(キャリッジリターン)から\r明らかです。$b

2つのオプションがあります。

  1. dos2unix次のツールを使用して、テキストファイルをUnixテキストファイル形式に変換します。

  2. 考慮して\r(値が行の末尾から取得されないため$b表示されません)$a

    if [ "$b" = "$c"$'\r' ]
    

答え2

IPoutファイルは、DOS文字の前にCarriage Return文字を含めるようにフォーマットされていますNewline

ファイルが適切なUNIX形式であることを確認してください。

関連情報