次のファイルがあり、それを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
2つのオプションがあります。
dos2unix
次のツールを使用して、テキストファイルをUnixテキストファイル形式に変換します。考慮して
\r
(値が行の末尾から取得されないため$b
表示されません)$a
if [ "$b" = "$c"$'\r' ]
答え2
IPoutファイルは、DOS
文字の前にCarriage Return
文字を含めるようにフォーマットされていますNewline
。
ファイルが適切なUNIX形式であることを確認してください。