比较两个字符串

比较两个字符串

我有一个数组,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

看看高级 Bash 脚本指南:数组

更新:

我做了一个测试。我认为你错过了数组数字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,并在上传后清理它们,正如我在评论中建议的那样就像你一样是删除mibwithtrapsbashscript重新创建它们并复制粘贴 paste.ubuntu.com 上的版本。

相关内容