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

두 가지 옵션이 있습니다:

  1. dos2unix다음과 같은 도구를 통해 텍스트 파일을 Unix 텍스트 파일 형식으로 변환합니다.

  2. 고려하고 \r( 값이 줄 끝에서 가져 오지 않기 때문에 $b나타나지 않습니다 ) 사용$a

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

답변2

IPout 파일은 DOS문자 앞에 Carriage Return문자를 포함하도록 형식이 지정되었습니다 Newline.

파일이 적절한 UNIX 형식인지 확인하십시오.

관련 정보