我在shell脚本中使用了一个while循环来逐行计数和编号我的file.txt。现在我想在循环内给出确切的行数,就像我命令wc -l一样。以下是我的剧本。
#!/bin/bash
let count=0
while read cdat ctim clat clon
do
h=${ctim:0:2}; # substring hours from ctim
m=${ctim:3:2};
s=${ctim:6:2};
# echo $j
if [[ $h>=11 ]]; then
if [[ $h<=18 ]] && [[ $s<=00 ]]; then
if [[ $m != 01 ]]; then # spaces around "!=" is necessary
echo "$count $LINE" $cdat $ctim $clat $clon
let count=$count+1
fi
fi
fi
done < cloud.txt
exit
输出包含如下行:
0 2014/04/00 14:44:00 26.12 -23.22
1 2014/11/21 16:05:00 19.56 -05.30
2 2014/01/31 13:55:00 02.00 31.10
3 2014/04/00 14:20:00 17.42 12.14
4 2014/07/25 15:30:00 35.25 05.90
5 2014/05/15 12:07:00 23.95 07.11
6 2014/07/29 17:34:00 44.00 17.43
7 2014/03/20 18:00:00 -11.12 -22.05
8 2014/09/21 12:00:00 06.44 41.55
我的问题是如何找到输出包含9行?
答案 0 :(得分:1)
这不能回答您的具体问题
if [[ $h>=11 ]]; then
if [[ $h<=18 ]] && [[ $s<=00 ]]; then
所有的测试始终返回true 。
test
,[
和[[
命令根据他们看到的参数数量采取不同的行动。
所有这些测试都有一个参数。在这种情况下,如果它是非空字符串,则表示您有成功的返回码。
在运营商周围设置空白至关重要。
if [[ $h >= 11 ]]; then
if [[ $h <= 18 ]] && [[ $s <= 00 ]]; then
问题:您对此测试的期望是什么? [[ $s <= 00 ]]
请注意,这些都是 lexical 比较。你可能想要这个:
# if hour is between 11 and 18 inclusive
if (( 10#$h >= 11 && 10#$h <= 18 )); then
答案 1 :(得分:0)
你已经用$ count知道了这个值。由于你从0开始计算,你想要的数字是$ count + 1.
答案 2 :(得分:0)
如果我在循环结束时添加命令“wc -l”,我可以得到我想要的,意味着行数(9行)。但是我想知道是否有办法将它完全放入循环中,也许使用相同的命令“wc -l”。
#!/bin/bash
let count=0
while read cdat ctim clat clon
do
h=${ctim:0:2}; # substring hours from ctim
m=${ctim:3:2};
s=${ctim:6:2};
if [[ $h>=11 && $h<=17 ]] || [[ $ctim == "18:00:00" ]]; then
echo "$count $LINE" $cdat $ctim $clat $clon
let count=$count+1
fi
done < cloud.txt | wc -l
出口
结果恰好是: 9
但现在如何在循环中做到这一点?