“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
此外我认为这是一种不那么优雅的方法,所以我想获得管道版本,而不是把它放到工作的温度,但无法弄清楚如何实现这一点......
非常感谢你提前...
答案 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