Почему «синтаксическая ошибка рядом с неожиданным токеном»?

Почему «синтаксическая ошибка рядом с неожиданным токеном»?

У меня есть около 10 тыс. (примерно 180x50x2) CSV-файлов, которые я хочу объединить следующим образом, но внутренний цикл for не работает из-за некоторых syntax error; я не вижу ошибки вlastFile

#!/bin/bash
dir='/home/masi/CSV/'
targetDir='/tmp/'
ids=(118 119 120)
channels=(1 2)
for id in ids;

        do
        for channel in channels;

                # example filename P209C1T720-T730.csv
                lastFile="$dir'P'$id'C'$channel'T1790-T1800.csv'"
                # show warning if last file does not exist
                if [[ -f $lastFile ]]; then
                    echo "Last file "$lastFile" is missing" 
                    exit 1
                fi

                filenameTarget="$targetDir'P'$id'C'$channel'.csv'"
                cat $dir'P'$id'C'$channel'T'*'.csv' > $filenameTarget

        done;
done

Ошибка

makeCSV.sh: line 12: syntax error near unexpected token `lastFile="$dir'P'$id'C'$channel'T1790-T1800.csv'"'
makeCSV.sh: line 12: `      lastFile="$dir'P'$id'C'$channel'T1790-T1800.csv'"'

ОС: Debian 8.5
Ядро Linux: 4.6 backports

решение1

doВо втором цикле for отсутствует :

for id in ids;

        do
        for channel in channels; do # <----- here ----

                # example filename P209C1T720-T730.csv
                lastFile="$dir'P'$id'C'$channel'T1790-T1800.csv'"
                # show warning if last file does not exist
                if [[ -f $lastFile ]]; then
                    echo "Last file "$lastFile" is missing" 
                    exit 1
                fi

                filenameTarget="$targetDir'P'$id'C'$channel'.csv'"
                cat $dir'P'$id'C'$channel'T'*'.csv' > $filenameTarget

        done;
done

Судя по обсуждению в комментариях, я вижу, что вы не совсем понимаете синтаксис цикла for.

Вот примерный синтаксис цикла for:

for name in list; do commands; done

doПеред командами всегда должен стоять символ «-» , а после команд — символ ;«-» (или новая строка) .done

Вот вариант с большим количеством новых строк:

for name in list
do
    commands
done

решение2

Работает исправно:

#!/bin/bash
dir='/home/masi/CSV/'
targetDir='/tmp/'
ids=(118 119 120)
channels=(1 2)
for id in ids ; do

        # Add do after ';'
        for channel in channels ; do

                # example filename P209C1T720-T730.csv
                lastFile="$dir'P'$id'C'$channel'T1790-T1800.csv'"
                # show warning if last file does not exist
                if [[ -f $lastFile ]] ; then
                    echo "Last file "$lastFile" is missing" 
                    exit 1
                fi

                filenameTarget="$targetDir'P'$id'C'$channel'.csv'"
                cat $dir'P'$id'C'$channel'T'*'.csv' > $filenameTarget

        done
done

В будущем используйте отладчик bash:bash -x /путь/к/вашему/скрипту.

Связанный контент