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
。