如何将“ls -tr | tail -n -6 | cut -c16-17 | sort -u | wc -l”正确放入if语句

时间:2014-01-29 10:30:44

标签: bash sorting if-statement cut tail

“ls -tr | tail -n -6 | cut -c16-17 | sort -u | wc -l”的输出为1 当最后6个文件在文件名中的特定位置上具有相等的值时,但是如何将其放入if / else语句以进一步检查?

我试过这个

if [ $(ls -tr | tail -n -6 | cut -c16-17 | sort -u | wc -l) ==1 ]
then 
zabbix_sender -z zabcol-pp.domain.com -s dvs.backup -k frameoffset -o "OK"
else 
zabbix_sender -z zabcol-pp.domain.com -s dvs.backup -k frameoffset -o "Failed"
fi

但是这不起作用,所以尝试通过将值解析为offset.txt文件,然后检查值是否相等而不是完美无缺,每隔一段时间而不是6但最后5文件被解析,第六个是一个不相等的空行,所以我得到一个“失败”的状态,而实际上并没有....

ls -tr | tail -n -6 | cut -c16-17 > ../offset.txt
if [ $(sort -u ../offset.txt | wc -l) == 1 ] 
then 
zabbix_sender -z zabcol-pp.domain.com -s dvs.backup -k frameoffset -o "OK"
else 
zabbix_sender -z zabcol-pp.domain.com -s dvs.backup -k frameoffset -o "Failed"
fi

此外我认为这是一种不那么优雅的方法,所以我想获得管道版本,而不是把它放到工作的温度,但无法弄清楚如何实现这一点......

非常感谢你提前...

3 个答案:

答案 0 :(得分:3)

只需使用等式-eq

if [ $(ls -tr | tail -n -6 | cut -c16-17 | sort -u | wc -l) -eq 1 ]

答案 1 :(得分:1)

同意@Brian Agnew的评论,提供额外帮助以减少管道。

if [ $(ls -t |awk 'NR<=6{a[substr($0,16,2)]}END{print length(a)}') -eq 1 ]

答案 2 :(得分:0)

虽然您有一个使用-eq的答案,但它并未解释您需要的原因,即使您应该使用{ {1}},您不一定需要

从第一次尝试开始:

-eq

最重要的是if [ $(ls -tr | tail -n -6 | cut -c16-17 | sort -u | wc -l) ==1 ] 。此位置中的==1字符对shell没有特殊意义,它会将=视为单个字。你需要确保有一个空格,如下所示:

==1

第二件可能是错误的,但不一定是错的,是if [ $(ls -tr | tail -n -6 | cut -c16-17 | sort -u | wc -l) == 1 ] 特定于几个炮弹。在这些shell中,它相当于100%标准和可移植的==测试。

=

第三件可能是错误的,但不一定是错的,if [ $(ls -tr | tail -n -6 | cut -c16-17 | sort -u | wc -l) = 1 ] 是字符串比较,而=是数字比较。您可以将-eq的输出视为字符串,并将其与字符串“1”进行比较,当且仅当wc看到一行时,您仍会获得匹配。但是,如果两个字符串有可能不同,但代表相同的数值,例如wc / 1 / 01,那么您确实需要数字比较{ {1}}:

 1