简体   繁体   中英

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

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

It is working in one of the Linux machine..When i copy same script to other Linux. I am getting below error. (I am pasting after insert in vi editor) .

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

Check to ensure that the \\ at the end of line 1 has no characters following it (spaces, tabs, and so on). If it does have characters after it, it won't be treated as a line continuation, and line 2 will be treated as a new command, invoking an error something like what you're seeing:

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

The best way to check this is to run a dump command like:

od -xcb ./freezemethod | head -30l

and examine the binary information for the first two lines of your file, the one that doesn't work.


By way of confirmation, the following file testprog.sh :

echo hello \
| cut -c1-2

when run with bash testprog.sh , will output the first two characters of hello :

he

If you place a space character after the \\ , you'll see:

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

with the echo working fine without the filter (outputting the full word), and the separate command causing issues because it begins with | .


And, based on what you posted in a comment, the problem is exactly what I described. Your od command produced (my addition to the last line):

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
        ^^^^

The 0a0d sequence is (you have to read it reversed) actually a CR/LF sequence which means your first line is:

mccli dataset show --recursive \^M

(with ^M representing the CR at the end of the line).

That means there is a character between the \\ and the end of the line, so the \\ is escaping it rather than acting as a line continuation character.

There are many options for removing those CR characters from files, such as those shown in this answer .

One method would be to first back up the file with:

cp freezemethod freezemethod-cr

and then use that backup file to recreate the original without the carriage returns:

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

This should give you a freezemethod with the correct line endings.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM