【问题标题】:substring in bash failing: syntax error near unexpected token `done'.bash 中的子字符串失败:意外标记“完成”附近的语法错误。
【发布时间】:2016-01-15 15:05:21
【问题描述】:

我正在尝试遍历日志文件并获取字符串的一部分。

日志文件包含:

Variable_name Value
Slave_running ON

首先我需要查看当前行是否包含子字符串Slave_running(从位置 0 开始的 13 个字符长)。如果我得到一个匹配项,那么我需要测试同一字符串右侧的字符是什么(14:2)。

这是我首先将子字符串打印到控制台的微弱尝试:

while read p; do
  echo ${$p:0:13}
done <slaverunning.log

这会返回:

syntax error near unexpected token `done'.   

我对 bash 子字符串语法错误有什么误解?

【问题讨论】:

    标签: bash comparison substring


    【解决方案1】:

    有语法错误,但不是意外令牌...

    ${...} 里面的$p 是错误的,这应该给出一个bad substitution 错误:

      echo ${$p:0:13}
    

    修复后,您的脚本应该可以工作了:

    while read p; do
      echo ${p:0:13}
    done <slaverunning.log
    

    【讨论】:

      【解决方案2】:

      首先,您的代码问题只是语法问题,您不需要在p 之前的$,只需要在{ 之前。以下应该按预期工作:

      while read p; do
        echo ${p:0:13}
      done < slaverunning.log
      

      也就是说,awk 似乎更适合这个问题,像这样:

      awk '/^Slave_running/ { if ($2 == "ON") { print "running"; } }' slaverunning.log
      

      Bash 字符串操作函数的精彩演练:http://www.thegeekstuff.com/2010/07/bash-string-manipulation/
      熟悉 awk 的好地方:http://www.grymoire.com/Unix/Awk.html

      【讨论】:

      • 我的错;把下划线误认为是空格——NVM
      猜你喜欢
      • 2015-05-10
      • 2015-01-01
      • 2018-07-03
      • 1970-01-01
      • 2011-08-02
      • 2014-02-26
      • 2018-12-18
      • 2014-01-20
      • 2015-12-11
      相关资源
      最近更新 更多