【问题标题】:./freezemethod: line 2: syntax error near unexpected token `|'./freezemethod:第 2 行:意外标记 `|' 附近的语法错误
【发布时间】:2015-03-20 05:41:21
【问题描述】:
mccli dataset show --recursive  \
| awk -F"/" '!/^Dataset.*Domain|^0,23000|^----|^$/ {print $2"/"$1}' \
| while read dataset
  do
    echo $dataset
    mccli dataset show --name="$dataset" | grep -i "freezemethod:value=none"
done

它在一台 Linux 机器上工作。当我将相同的脚本复制到其他 Linux 时。我得到以下错误。 (我在 vi 编辑器中插入后粘贴) .

./freezemethod: line 2: syntax error near unexpected token `|'
'/freezemethod: line 2: `| awk -F"/" '!/^Dataset.*Domain|^0,23000|^----|^$/ {print $2"/"$1}' \

【问题讨论】:

    标签: linux shell


    【解决方案1】:

    检查以确保第 1 行末尾的 \ 后面有 no 个字符(空格、制表符等)。如果它 确实 后面有字符,则不会将其视为续行,而第 2 行将被视为 new 命令,从而调用类似于以下内容的错误你看到的是:

    ./freezemethod: line 2: syntax error near unexpected token '|'
    

    最好的检查方法是运行如下转储命令:

    od -xcb ./freezemethod | head -30l
    

    并检查文件前两行的二进制信息,不起作用的那一行。


    作为确认,以下文件testprog.sh

    echo hello \
    | cut -c1-2
    

    使用bash testprog.sh运行时,会输出hello的前两个字符:

    he
    

    如果您在\ 之后放置一个空格字符,您将看到:

    hello
    testprog.sh: line 2: syntax error near unexpected token '|'
    testprog.sh: line 2: '| cat'
    

    echo 工作正常没有过滤器(输出完整的单词),并且单独的命令导致问题,因为它以 | 开头。


    而且,根据您在评论中发布的内容,问题正是 我所描述的。您的od 命令已生成(我对最后一行的补充):

    root@w2ran0301:/tmp/#: od -xcb ./freezemethod | head -30l
    0000000 636d 6c63 2069 6164 6174 6573 2074 6873
            m c  c l  i    d a  t a  s e  t    s h
            155 143 143 154 151 040 144 141 164 141 163 145 164 040 163 150 
    0000020 776f 2d20 722d 6365 7275 6973 6576 5c20
            o w    -  - r  e c  u r  s i  v e    \
            157 167 040 055 055 162 145 143 165 162 163 151 166 145 040 134 
    0000040 0a0d 207c 7761 206b 462d 2f22 2022 2127
            ^^^^
    

    0a0d 序列是(你必须倒过来读)实际上是一个CR/LF 序列,这意味着你的第一行是:

    mccli dataset show --recursive \^M
    

    ^M 代表行尾的 CR)。

    这意味着在 \ 和行尾之间有一个 字符,因此 \ 正在转义 it 而不是作为行继续字符。

    有许多选项可以从文件中删除这些 CR 字符,例如 this answer 中显示的那些。

    一种方法是先备份文件:

    cp freezemethod freezemethod-cr
    

    然后使用该备份文件重新创建原始没有回车:

    sed 's/\r$//' freezemethod-cr >freezemethod
    

    这应该会给你一个 freezemethod 并带有正确的行尾。

    【讨论】:

    • 不,第一行“\”之后没有字符,我仍然收到同样的错误......
    • @anoop,我已经用额外的信息更新了这个问题,这是检测行尾是否存在实际问题的最佳方法。考虑到我的测试程序中的错误消息完全相同,这似乎不是问题,但额外的信息应该有助于解决这个问题。只要确保你在 failing 脚本上运行它,而不是原来的。
    • root@w2ran0301:/tmp/#: od -xcb ./freezemethod | head -30l 0000000 636d 6c63 2069 6164 6174 6573 2074 6873 m c c l i d a t a s e t s h 155 143 143 154 151 040 144 141 164 141 163 145 164 040 163 150 0000020 776f 2d20 722d 6365 7275 6973 6576 5c20 o w - - r e c u r s i v e \ 157 167 040 055 055 162 145 143 165 162 163 151 166 145 040 134 0000040 0a0d 207c 7761 206b 462d 2f22 2022 2127
    • @anoop,没关系,您发布的内容足以诊断问题。请参阅我的更新以进行进一步分析和修复。
    • 谢谢您.. 我会期待您的诊断,如果您需要其他任何信息来调查此问题,请告诉我......
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-31
    • 2012-10-20
    • 2012-09-29
    • 2013-12-11
    • 1970-01-01
    相关资源
    最近更新 更多