./冻结方法:第 2 行:意外标记"|"附近的语法错误


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}' 

检查以确保第 1 行末尾的后面没有字符(空格、制表符等(。如果它后面确实有字符,它不会被视为行延续,第 2 行将被视为命令,调用类似于您所看到的错误:

./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(。

这意味着在和行尾之间有一个字符,因此正在转义,而不是充当行延续字符。

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

一种方法是首先使用以下命令备份文件:

cp freezemethod freezemethod-cr

然后使用该备份文件重新创建不带回车符的原始文件:

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

这应该为您提供具有正确行尾的freezemethod

最新更新