zsh函数抛出";错误的数学表达式:非法字符“;错误

zsh函数抛出";错误的数学表达式:非法字符“;错误,zsh,Zsh,我想创建一个简单的函数,该函数使用通过curl访问的适当标签打印文件大小。这是我在.zshrc配置中包含的内容: function curl-size { BYTELENGTH=$(curl -sI $1 | grep -i Content-Length | awk '{print $2}') if (($BYTELENGTH>1000000000));then VALUE=$(echo "scale=3;$BYTELENGTH/1000000000" | bc -l)

我想创建一个简单的函数,该函数使用通过curl访问的适当标签打印文件大小。这是我在
.zshrc
配置中包含的内容:

function curl-size {
  BYTELENGTH=$(curl -sI $1 | grep -i Content-Length | awk '{print $2}')
  if (($BYTELENGTH>1000000000));then
    VALUE=$(echo "scale=3;$BYTELENGTH/1000000000" | bc -l)
    LABEL="gb"
  elif (($BYTELENGTH>1000000));then
    VALUE=$(echo "scale=3;$BYTELENGTH/1000000" | bc -l)
    LABEL="mb"
  elif (($BYTELENGTH>1000));then
    VALUE=$(echo "scale=3;$BYTELENGTH/1000" | bc -l)
    LABEL="kb"
  else
    VALUE=$BYTELENGTH
    LABEL="bytes"
  fi
  echo $(echo "$VALUE" | grep -o '.*[1-9]') $LABEL
}
尝试使用
卷曲大小https://i.imgur.com/A8eQsll.jpg
在终端中返回

curl-size:2: bad math expression: illegal character: ^M
curl-size:5: bad math expression: illegal character: ^M
curl-size:8: bad math expression: illegal character: ^M
curl-size:12: bad math expression: illegal character: ^M

^M
是另一种称为回车符的字符,也就是说,光标返回到当前行开头的指令。在DOS衍生平台上,文本文件的行由
序列分隔(而在UNIX系列平台上,文本文件的行仅由
终止;请注意,这意味着在UNIX上,文本文件的最后一行需要有
才能有效,而在Windows上,尾随的
会导致文件末尾出现空行)


如果您使用
curl
连接的web服务器返回带有DOS换行符的内容,则这些回车符将被视为内容而不是代码。一种效率较低但可行的修复方法可能如下所示:

BYTELENGTH=$(curl -sI "$1" | tr -d '\r' | awk '/Content-Length/ {print $2}')

请注意,在为符合POSIX的Shell编写脚本时,为自己的变量使用all caps名称是一个坏主意——它保留小写名称供应用程序使用,并专门为修改其行为的变量使用all caps名称空间——但zsh不符合POSIX且不遵循此约定,因此本指南不适用。

^M
是另一种称为回车符的字符,也就是说,指示光标返回到当前行的开头。在DOS派生平台上,文本文件的行由
序列分隔(而在UNIX系列平台上,文本文件的行仅由
终止;请注意,这意味着在UNIX上,文本文件的最后一行需要有
才能有效,而在Windows上,尾随的
会导致文件末尾出现空行)


如果您使用
curl
连接的web服务器返回带有DOS换行符的内容,则这些回车符将被视为内容而不是代码。一种效率较低但可行的修复方法可能如下所示:

BYTELENGTH=$(curl -sI "$1" | tr -d '\r' | awk '/Content-Length/ {print $2}')

请注意,在为符合POSIX的Shell编写脚本时,为自己的变量使用all caps名称是一个坏主意——它保留小写名称供应用程序使用,并专门为修改其行为的变量使用all caps名称空间——但zsh不符合POSIX且不遵循此约定,因此本指南不适用于此。

(1)bash或zsh?它们是两个非常不同、互不兼容的shell;您应该标记其中一个,但不能同时标记两个。(2)此特定问题是由“询问问题代码之前”中的第一件事引起的第节——尽管回车可能在
curl
返回的内容中,而不是在您的输入文件中,但是如果您的shell是bash(或者实际上是任何其他兼容POSIX的shell),而不是zsh(它故意打破标准强制的无引号字符串拆分行为),那么同样的修复也适用于.BTW,这里有一些引用错误--请运行您的代码,以便为您识别它们。@CharlesDuffy valid point如果是zsh,顺便说一句,您实际上不需要
bc
这里--shell有本机浮点数学。@Brice,…顺便说一句,您可能希望养成使用
(1)的习惯bash或zsh?它们是两个非常不同、互不兼容的shell;您应该标记其中一个,但不能同时标记两个。(2)这个特定问题是由“询问问题代码之前”中的第一件事引起的第节——尽管回车可能在
curl
返回的内容中,而不是在您的输入文件中,但是如果您的shell是bash(或者实际上是任何其他兼容POSIX的shell),而不是zsh(它故意打破标准强制的无引号字符串拆分行为),那么同样的修复也适用于.BTW,这里有一些引用错误--请运行您的代码,以便为您识别它们。@CharlesDuffy valid point如果是zsh,顺便说一句,您实际上不需要
bc
这里--shell有本机浮点数学。@Brice,…顺便说一句,您可能希望养成使用