【问题标题】:Comparing variable to string in Bash在 Bash 中将变量与字符串进行比较
【发布时间】:2015-08-14 04:17:09
【问题描述】:

我已经尝试了How do I compare two string variables in an 'if' statement in Bash?的建议

但这对我不起作用。

我有

if [ "$line" == "HTTP/1.1 405 Method Not Allowed" ]
then
    <do whatever I need here>
else
    <do something else>
fi

无论如何,它总是转到 else 语句。我什至在此之前呼应了 $line,然后复制并粘贴了结果,以确保字符串是正确的。

任何关于为什么会发生这种情况的帮助将不胜感激。

【问题讨论】:

  • http版本后面可能有换行符?
  • test 使用单 = 进行字符串比较,而不是双 ==
  • 顺便说一句,不要回显该行(这不会让您看到不可见的字符),而是尝试使用 bash printf %q 格式将该行显示为 bash 字符串:printf %q\\n "$line" (引号很重要。)

标签: string bash compare


【解决方案1】:

如果您从兼容的 HTTP 网络连接读取该行,则几乎可以肯定它的末尾有一个回车符(\x0D,通常表示为\r),因为 HTTP 协议使用 CR-LF 终止的行。

因此您需要删除或忽略 CR。

如果您使用的是 bash,这里有几个选项:

  1. 使用 bash 查找和替换语法从行中删除 CR(如果存在):

    if [ "${line//$'\r'/}" = "HTTP/1.1 405 Method Not Allowed" ]; then
    
  2. 使用全局比较来进行前缀匹配(需要[[ 而不是[,但无论如何这更好):

    if [[ "$line" = "HTTP/1.1 405 Method Not Allowed"* ]]; then
    
  3. 您可以在[[ 中使用正则表达式比较来进行子字符串匹配,可能使用正则表达式:

    if [[ $line =~ "Method Not Allowed" ]]; then
    

    (如果使用正则表达式,请确保不引用正则表达式运算符。)

【讨论】:

  • 好的,上面的两个选项都试过了,但仍然只能得到“else”版本。
  • 我能以某种方式匹配文本的“不允许的方法”部分吗?
  • @bmcgonag:当然。 (如果您使用的是 bash。)if [[ "$line" == *"Method Not Allowed"* ]]; then ...(但如果我的解决方案不起作用,您可能没有使用 bash。请检查。)
  • @bmcgonag:添加了一个正则表达式选项,尽管它也依赖于使用 bash。
  • 我将您的答案与变音符号结合使用。 if [ "$line" = "方法不允许" ];然后 。谢谢你们。
猜你喜欢
  • 2018-03-17
  • 1970-01-01
  • 2021-03-08
  • 1970-01-01
  • 1970-01-01
  • 2015-10-03
  • 2015-11-21
  • 2018-05-01
  • 1970-01-01
相关资源
最近更新 更多