【问题标题】:Syntax error: invalid token operator (error token is " [duplicate]语法错误:无效的令牌运算符(错误令牌是“ [重复]
【发布时间】:2021-07-21 02:33:50
【问题描述】:

在做一个基本的 shell 脚本时,我无法使用 curl 获取文件的长度,然后将其分割,以及文本:

syntax error: invalid token operator (error token is"

不断出现。

简化的代码是:

    head=$(curl -sI $dir | awk '/Content-Lenth/{print $2}') 
    res=$(($head/3))

我一直在阅读类似问题的解决方案,他们说删除变量可能在其末尾的\r,所以我把它放在两行的中间,但问题仍然存在:

head=${head//\r}

知道为什么会这样吗?是因为末尾有一个\r 字符吗?如果是这样,如何去除?

【问题讨论】:

  • 听起来有点像Difference between sh and bash;你到底是如何运行这个脚本的?数据中的 DOS 回车不会在脚本中产生语法错误(但您需要 $'\r' 而不仅仅是 \r)。
  • 显示完整的错误信息。
  • @Barmar /3") 语法错误:算术运算符无效(错误标记为“
  • 也许您应该在第一行之后临时添加echo "$head",这样您就可以看到该变量实际包含的内容。
  • 注意顺便说一句:Content-Lenth [原文如此] ... ...

标签: linux bash shell


【解决方案1】:

我能够重现您的问题,对我而言,这确实是由 $head 值末尾的回车引起的。这源于 HTTP 协议规范:HTTP 使用回车/换行序列作为行终止符(如 DOS 和 Windows),awk 不会将回车识别为空格。

您尝试删除回车...

head=${head//\r}

... 没有达到这个目的。 \ 是 shell 的通用转义字符,保留后面任何字符的字面意思。由于字符r对shell没有特殊意义,所以上面的代码等价于

# Oops, not what you meant:
head=${head//r}

我使用了这个替代方案:

# Strip all non-digits:
head=${head//[^0-9]}

,这为我解决了这个问题。

但也请注意,

  1. 您拼错了“长度”,并且
  2. HTTP header names are not case sensitive,但默认情况下,awk 是正则表达式。因此,即使在拼写更正后,您的 awk 命令在某些情况下也可能无法匹配所需的标头。

这是解决所有这些问题的脚本版本:

head=$(curl -sI "$dir" | awk 'BEGIN{IGNORECASE=1} /Content-Length/{print $2}') 
head=${head//[^0-9]}
res=$(($head/3))

最后两行可以合并为一行,但为了清楚起见,我将它们分开。如果您也想将$head 的值用于其他目的,这也可能会很好。

【讨论】:

猜你喜欢
  • 1970-01-01
  • 2016-10-18
  • 1970-01-01
  • 1970-01-01
  • 2013-07-16
  • 2019-02-09
  • 1970-01-01
  • 2014-09-18
相关资源
最近更新 更多