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

时间:2018-10-26 15:51:00

标签: 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)
    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
}

尝试在终端中使用curl-size 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

1 个答案:

答案 0 :(得分:2)

^M是否则称为回车符的字符,也就是说,指示光标返回到当前行的开头。在DOS衍生平台上,文本文件的行以<CR><LF>序列分隔(而在UNIX系列平台上,文本文件的行以终止仅由<LF>开头;请注意,这意味着在UNIX上,文本文件的最后一行应在结尾处具有<LF>,以使最后一行有效,而在Windows上,尾随的{{1 }}在文件末尾产生一个空行。


如果您要与<CR><LF>连接的Web服务器返回的内容是DOS换行符,则这些回车将被视为内容而不是代码。效率低下但可行的修复可能如下所示:

curl

请注意,在为符合POSIX的shell编写脚本时,对您自己的变量使用全大写字母名称是个坏主意-通过standard-mandated convention保留小写名称供应用程序使用,并专门使用全大写字母-为修改其行为的变量使用caps命名空间-但zsh 符合POSIX,并且不遵循此约定,因此该指南不适用于此。