我尝试在 if 语句中比较两个字符串。但是,由于程序每次都通过第一个条件,因此比较似乎无法正确运行。
#!/bin/bash
switch=$(ssh 192.168.14.10 egrep somefile /tmp/tmpfile.txt)
if [ "$switch" == "tmp" ]; then
echo "expected output"
else
echo "unexpected output"
fi
每次输出都会达到“预期输出”。我什至尝试将第一个条件更改为“!=”,但它仍然到达第一个语句。
答案1
您的比较是正确且惯用的 Bash 代码。
尝试echo "switch='$switch'"
在之前插入if
,看看每次变量内容是什么。
答案2
我首先排除虚假空间:
if [ "$(printf "%s" "$switch"| tr -d " ")" = tmp ]; then
如果仍然不成功,请在测试之前添加这两行。如果它们的输出不同,请修复您的测试。
echo tmp | od -c
echo "$switch" | od -c
答案3
将第一行更改为:
switch=$(ssh 192.16810.10.10 egrep somefile /tmp/tmpfile.txt)
至以下内容:
export switch=$(ssh 192.16810.10.10 egrep somefile /tmp/tmpfile.txt)
我之前多次遇到过几乎相同的问题,或者在递增变量时遇到过。其中variable=$variable++
orvariable=$variable+1
会在每次循环时将文本字符串"+1"
or附加"++"
到末尾,而不是像应有的那样递增。
使用let variable=$variable++
或let variable=$variable+1
立即解决问题。export
如果在循环开始之前一切都已设置,则使用也有效。
我相信 bash 在存储该变量时做错了什么。因此,它使比较起作用,并且使用 let/export 做了一些不同的事情来存储它。我正在寻找同一问题的答案,但比较数字而不是字符串时得到的结果不一致。无论如何,在第一个语句之前尝试使用导出不会有什么坏处。