我有一个文件如下所示,我正在 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.txt
是 DOS 文本文件。从跟踪输出中\r
值末尾的(回车)可以明显看出这一点。$b
您有两个选择:
通过例如工具将文本文件转换为Unix文本文件格式
dos2unix
,或者考虑
\r
到$b
(它不会出现,$a
因为它的值不是从行尾获取的)并用if [ "$b" = "$c"$'\r' ]
答案2
您的 ipout 文件的DOS
格式是在字符之前包含Carriage Return
字符Newline
。
确保您的文件采用适当的 UNIX 格式。