bash中复制粘贴的字符串不等于变量中的字符串



我试图比较变量中的字符串(从curl输出中获得(和IF语句中的双引号字符串,它们总是不相等的:

$ curlResult="$(curl -Isk https://stackoverflow.com | head -n 1)"
$ echo $curlResult
HTTP/2 200 
$ if [ "$curlResult" != "HTTP/2 200" ] ; then echo 1; else echo 0; fi 
1

我尝试过的:

  1. 通过字符串手动设置变量,然后它们变得相等,因此问题出现在curl输出中。

  2. xargs添加到卷曲输出中以删除空格,但没有帮助:

    $ curlResult="$(curl -Isk https://stackoverflow.com/questions/ask | head -n 1 | xargs)"

我是bash的新手,所以可能我丢失了一些重要的东西。

curlResult以一个空格结尾,后跟r。您可以从变量中删除它们,也可以在测试中忽略它们。我会用测试

if [[ "$curlResult" =~ "HTTP/2 200" ]]; then
echo "OK"
else
echo "NOK"
fi

这是因为字符串中仍然包含echo:等未打印的字符

$ curlResult="$(curl -Isk https://stackoverflow.com | head -n 1)"
$ printf "%sn" $curlResult
HTTP/2
200

您可以执行以下操作:

$ curlResult="$(curl -Isk https://stackoverflow.com | head -n 1 | tr -dc '[[:print:]]')"
$ if [[ "$curlResult" != "HTTP/2 200 " ]] ; then echo 1; else echo 0; fi
0

请注意,我在"HTTP/2 200"之后留下了一个空白。如果它困扰你,你也可以用tr删除它。

每个标头都由回车/换行(CR/LF(对终止,但只有LF被命令替换剥离,将CR作为curlResult值的一部分。

$ curlResult="$(curl -Isk https://stackoverflow.com | head -n 1)"
$ echo "${curlResult@Q}"
$'HTTP/2 200 r'

您可以使用模式匹配来匹配行的非空白前缀

$ [[ $curlResult = "HTTP/2 200" ]] && echo success
$ [[ $curlResult = "HTTP/2 200"*([[:space:]]) ]] && echo success
success

*([[:space]])匹配零个或多个空白字符,包括回车。

最新更新