【问题标题】:Extract number from String in bash从bash中的字符串中提取数字
【发布时间】:2013-10-18 20:59:21
【问题描述】:

我想从字符串中提取一个数字并将该数字用于以后的计算

while IFS= read line ; do  

  if [[ "$line" == Content-Length* ]]
  then
  size=$(echo "$line" | awk '{print $2}')   
  echo "$size"
  let size=$size+1  
  echo "$size"
  break
  fi    
done <files

文件有一行

Content-Length: 4806

但输出看起来像这样

4806
+1")syntax error: invalid arithmetic operator (error token is "
4806

我尝试了超过 5 小时,但找到了为什么会发生这种情况。有人可以告诉我原因

【问题讨论】:

  • 我运行了你的脚本,它运行良好。
  • 您正在解析的文件具有 DOS 行结尾,这导致 $line 以回车符 (\r) 结尾。这个回车以size 的值结束,let 语句阻塞了它。请注意奇怪的错误,$size 后面的文本出现在错误消息的开头,而不是结尾。实际的错误令牌是4806\r+1
  • Thanq @chepner 但你能告诉我如何解决这个问题
  • (对我之前的评论稍作修正,错误标记是\r+1。来不及编辑评论)。

标签: linux string bash awk


【解决方案1】:

您可以利用Content-Length: 4806 实际上是一对以空格分隔的字符串这一事实。

while read -r field value; do
    if [ "$field" = "Content-Length" ]; then
        echo "$size"
        echo "$((size+1))"
    fi
done < files

要解决 DOS 行尾问题,可以通过dos2unix 或其他工具运行文件来修复行尾,或者使用修剪回车

size=${size%.}

这将从其值中删除size 的最后一个字符。建议修复文件,而不是围绕它进行编码。

【讨论】:

    【解决方案2】:

    你可以替换:

    let size=$size+1
    

    let size=$[$size+1]
    

    let size=$[size+1]
    

    let size++
    

    let size=`expr $size + 1`
    

    所有示例在 ubuntu 13.04 上都可以正常运行,您也是。

    【讨论】:

    • 在 Ubuntu 中,您可以删除 let 并使用 ((size++))。而且你不应该使用背部抽动``使用括号$()这样let size=$(expr $size + 1)
    猜你喜欢
    • 1970-01-01
    • 2011-04-03
    • 2019-02-21
    • 2023-03-17
    • 2012-09-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-04-26
    相关资源
    最近更新 更多