我有一个数组,sev[w]
其中 w 的范围从 1 到 21。
该数组包含以下内容:
批判的 信息 批判的 信息 信息 信息 批判的 批判的 信息 信息 批判的 信息 信息 信息 信息 信息 信息 信息 信息 信息 信息
我要比较字符串并打印 shte
如果 [ “${sev[0]}” == 严重 ] 然后 回显“shte” 菲
sev[0]
已CRITICAL
存储在其中
但是它不起作用。
感谢您的帮助!
编辑
代码脚本。
这mibwithtraps。
答案1
我猜你的mibwithtraps
文件是使用 Windows 创建的,因此有\r\n
行尾。这会破坏你的脚本:
$ printf 'foo\r\n' | while read a; do
[[ "$a" == "foo" ]] && echo 'Matches!' || echo 'No match!';
done
No match!
正如您上面看到的,\r
包含在变量中,因此除非您将其包含在测试中,否则它实际上并不匹配:
$ printf 'foo\r\n' | while read a; do
[[ "$a" == "foo"$'\r' ]] && echo 'Matches!' || echo 'No match!';
done
Matches!
在处理在其他操作系统上创建的文件时,你始终需要考虑这一点。一种简单的检查方法是将文件的第一行传递过去od -c
。对 pastebin 中的文本执行此操作(需要下载原始文本,复制/粘贴不起作用),我得到:
$ head -1 dmvHuedP.asc | od -c
0000000 a d a p t e c . m i b , s C S
0000020 I S m a r t 1 , . 1 . 3 . 6 . 1
0000040 . 4 . 1 . 7 9 5 . 2 . 5 . 0 . 1
0000060 0 1 , C R I T I C A L , \r \n
0000076
所以,这\r
确实是问题所在。下次,您可以使用dos2unix
以下方法删除这些内容:
$ head -1 dmvHuedP.asc | dos2unix | od -c
0000000 a d a p t e c . m i b , s C S
0000020 I S m a r t 1 , . 1 . 3 . 6 . 1
0000040 . 4 . 1 . 7 9 5 . 2 . 5 . 0 . 1
0000060 0 1 , C R I T I C A L , \n
0000075
赶紧跑
dos2unix file > newfile
或者,您可以使用标准 UNIX 工具:
tr -d '\r' < file > newfile
sed -i 's/\r//g' file
答案2
正确的语法是:
if [[ "${sev[1]}" == "CRITICAL" ]]; then
echo "shte"
fi
更新:
我做了一个测试。我认为你错过了数组数字1不是关键信息,而是信息性信息。sev[0] 仍然为关键信息,且不为空
以下是一个简单的测试:
sev=( CRITICAL INFORMATIONAL )
if [[ "${sev[0]}" == "CRITICAL" ]]; then echo "shte"; fi
输出为:
shte
现在:
if [[ "${sev[1]}" == "CRITICAL" ]]; then echo "shte"; fi
输出为空
答案3
按照你的评论,你的脚本中的某处可能有一些奇怪的角色。
在这种情况下,最直接的解决方案是将输入文件和脚本发布到 paste.ubuntu.com,并在上传后清理它们,正如我在评论中建议的那样和就像你一样是删除mibwithtraps
并bashscript
重新创建它们并复制粘贴 paste.ubuntu.com 上的版本。