【问题标题】:syntax error near unexpected token `<<<'意外标记“<<<”附近的语法错误
【发布时间】:2016-10-07 07:17:23
【问题描述】:

我有一个 bash 脚本,它可以在我的系统中正确运行:

uname -a
Linux debian 3.16.0-4-amd64 #1 SMP Debian 3.16.7-ckt25-2 (2016-04-08) x86_64 GNU/Linux

但我需要它在 Redhat 7.2 chroot 中工作:

Linux debian 3.16.0-4-amd64 #1 SMP Debian 3.16.7-ckt25-2 (2016-04-08) x86_64 unknown

相同的代码在第一个代码上正确执行,但是当它首先在 7.2 上运行时,它不能识别 sed -i(只是 -i 参数)。评论一些行会遇到另一个问题:

bash: command substitution: line 1: syntax error near unexpected token `<<<'

问题是,这个脚本需要在带有 debian 7.2 的远程机器上执行(这就是为什么我要在具有相同发行版的 chroot 中测试它),所以安装模块/升级是没有解决方案的它可以运行。

示例代码:

#!/bin/bash       
...
count=0                                                                                                                                     
while read line; do                                                                                                                         
    if echo "$line" | grep -q ')'                                                                                                           
    then                                                                                                                                    
        ((count++))                                                                                                                         
        comas=`grep -o "," <<< "$line" | wc -l`                                                                                             
        num=`grep -o "byRef" <<< "$line" | wc -l`  
...
sed -i 's/shortInteger/int/g' "test.h"

有什么想法吗?

谢谢。

编辑: 这些是给我带来麻烦的命令:

comas=`grep -o ","

sed -i 's/shortInteger/int/g' "test.h"

编辑 2:

GNU bash,版本 2.05.8 -->“这里的字符串”(

grep (GNU grep) 2.4.2 --> -o 选项不存在

GNU sed 3.02 版 --> -i 选项不存在

【问题讨论】:

  • 如果您在代码中指出错误的行号,那么您需要显示完整的脚本,否则它是无用的。
  • @Inian 代码太长,这里就不贴了,为了保护代码隐私,我应该改很多字。在示例中,我指出了引发错误的两行。我将编辑帖子以使其脱颖而出。
  • 第一行可以改为:comas=`printf '%s' "$line" | grep -o "," | wc -l` 。对于第二个:每个 sed 的版本是什么(来自您的系统和来自 7.2 chroot?
  • 对于 grep 行,最好试试 comas=$(echo "$line" | grep -c ",")num=$(echo "$line" | grep -c "byRef")。 grep 的 -c 选项由 POSIX 定义,应该适用于较旧的 grep。
  • 旧的 sed 3.02 手册似乎没有-i 选项(就地编辑)。您将需要使用临时文件。试试看:sed 's/shortInteger/int/g' "test.h" &gt; test.temp.h; mv "test.temp.h" "test.h"

标签: linux bash sed


【解决方案1】:

最后我得到了以下...

对于我无法更新的版本:

sed 解决方案

sed 's/shortInteger/int/g' "test.h" > test.temp.h;

mv "test.temp.h" "test.h"

@sorontar 指出了这一点。非常感谢!

在字符串中查找特殊字符或子字符串

comas=$(echo "$line" | tr " " "\n" | grep -c ",")

根据我的源文件,有一个模式,所以在任何逗号后面都有一个空格。所以tr " " "\n"在空格之间分隔子串,换行,然后我可以使用grep -c ","来计算每一行,里面有一个逗号。

【讨论】:

  • 如果要数逗号,可能更直接的做法是tr -dc , | wc -c
  • @WilliamPursell 谢谢。这也有效并且更智能
猜你喜欢
  • 2012-08-31
  • 2012-10-20
  • 2012-09-29
  • 2013-12-11
  • 1970-01-01
  • 2014-09-01
  • 2014-02-26
  • 2018-12-18
相关资源
最近更新 更多