我是bash脚本的初学者,我想问一些事情。
我的条件语句将计算机中的时间与字符串中的时间进行比较,如下所示:
#!/bin/bash
skrg=$(date +%H%M%S)
while IFS=':' read LINE do
tanggal=${LINE//[:]/}
if test $skrg -ge $tanggal
then
echo string
sed -e 's/$/LINE/' -i soal
fi
done < soal
echo命令在if语句下工作,但sed没有,它仍然添加LINE字符串,即使if语句错误。
我对这个问题非常困惑,谢谢你的帮助:D
示例输入:
01:12:14
7时08分45秒
22时10分45秒
输出: 它应该像这样=
01:12:14 LINE
07:08:45 LINE
22时10分45秒
但输出是=
01:12:14 LINE
07:08:45 LINE
22:10:45 LINE
答案 0 :(得分:2)
问题是,
sed -e 's/$/LINE/' -i soal
因为,sed
将在所有行中应用s/$/LINE/
替换。这就是为什么,你没有得到预期的产出。
要调试:
在cat soal
循环结束时添加while
。像这样,
#!/bin/bash
skrg=$(date +%H%M%S)
while IFS=':' read LINE do
tanggal=${LINE//[:]/}
if test $skrg -ge $tanggal
then
sed -e 's/$/LINE/' -i soal
fi
cat soal
done < soal
<强>解决方案:强>
您需要在进行替换时使用行号。
#!/bin/bash
skrg=$(date +%H%M%S)
line=1
while IFS=':' read LINE
do
tanggal=${LINE//[:]/}
if test $skrg -ge $tanggal
then
sed -i "$line{s/$/LINE/}" soal
fi
line=$((line+1))
done < soal
答案 1 :(得分:1)
你的输出搞砸了,因为你一直在覆盖输入文件!
sed -e 's/$/LINE/' -i soal
这实际上会覆盖soal
。
答案 2 :(得分:1)
主要保留您的代码
#!/bin/bash
skrg=$(date +%H%M%S)
while IFS=':' read LINE do
tanggal=${LINE//[:]/}
if test $skrg -ge $tanggal
then
echo string
echo "${LINE} LINE" >> /tmp/soal.tmp
else
echo "${LINE}" >> /tmp/soal.tmp
fi
done < soal
mv /tmp/soal.tmp soal