2014-12-25 3 views
1

Этот общий вопрос задавался много раз, и почти всегда существует явная проблема синтаксиса. Но это кажется правильным:Синтаксическая ошибка при простом цикле

cat mixed_encoded.txt | 
while read i do 
type=${"$(echo "$i" | file -bi -)"#*=} 
if [[ $type == 'iso-8859-1' ]]; then 
    echo "$i" | iconv -f ISO-8859-1 -t UTF-8 
else 
    echo "$i" 
fi 
done > utf8_encoded.txt 

дает

bash: syntax error near unexpected token `done' 

ли вставлен как многострочный или в режиме одной строки. С окончанием > utf8_encoded.txt. С закрытыми внутренними кавычками или нет.

Что может быть неправильным?

+0

Try и поставить 'while' сразу после трубы в предыдущей строке. – fejese

+0

Неправильно. – jgritty

+0

Не используйте 'cat' для перебора файлов – BroSlow

ответ

1
cat mixed_encoded.txt | 
while read i; do 
type=${"$(echo "$i" | file -bi -)"#*=} 
if [[ $type == 'iso-8859-1' ]]; then 
    echo "$i" | iconv -f ISO-8859-1 -t UTF-8 
else 
    echo "$i" 
fi 
done > utf8_encoded.txt 

Вам не хватает точки с запятой.

Это только фиксирует токен done. Замена все еще плохая.

Это изменение фиксирует плохую замену:

cat mixed_encoded.txt | 
while read i; do 
type=$(echo "$i" | file -b --mime-encoding -) 
if [[ $type == 'iso-8859-1' ]]; then 
    echo "$i" | iconv -f ISO-8859-1 -t UTF-8 
else 
    echo "$i" 
fi 
done > utf8_encoded.txt 
+0

Перед толкованием новой строки не требуется использовать двоеточие. –

+0

Но это необходимо перед 'do' – jgritty

+1

Перед' do' вам нужна либо двоеточие, либо новая строка, но не оба. –

Смежные вопросы