bash 中的子字符串失败:意外标记“完成”附近出现语法错误。

substring in bash failing: syntax error near unexpected token `done'.

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

日志文件包含:

Variable_name Value
Slave_running ON

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

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

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

这个returns:

syntax error near unexpected token `done'.   

bash 子字符串语法有误吗?

存在语法错误,但这与意外标记无关...

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

  echo ${$p:0:13}

修复后,您的脚本应该可以运行:

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

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

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

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

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

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